Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libupnpp for openSUSE:Factory checked in at 2026-10-14 18:35:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libupnpp (Old) and /work/SRC/openSUSE:Factory/.libupnpp.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libupnpp" Wed Oct 14 18:35:21 2026 rev:13 rq:1384665 version:1.0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/libupnpp/libupnpp.changes 2025-06-10 09:07:00.195696324 +0200 +++ /work/SRC/openSUSE:Factory/.libupnpp.new.3698736/libupnpp.changes 2026-10-14 18:36:06.183347200 +0200 @@ -1,0 +2,7 @@ +Tue Oct 13 16:28:07 UTC 2026 - Bjørn Lie <[email protected]> + +- Update to version 1.0.4: + * Build: use internal XML parser instead of expat. +- Drop pkgconfig(expat) BuildRequires: following upstream changes. + +------------------------------------------------------------------- Old: ---- libupnpp-1.0.3.tar.gz libupnpp-1.0.3.tar.gz.asc New: ---- libupnpp-1.0.4.tar.gz libupnpp-1.0.4.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libupnpp.spec ++++++ --- /var/tmp/diff_new_pack.EskPt4/_old 2026-10-14 18:36:07.133387200 +0200 +++ /var/tmp/diff_new_pack.EskPt4/_new 2026-10-14 18:36:07.134387242 +0200 @@ -1,7 +1,7 @@ # # spec file for package libupnpp # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2025 Andreas Stieger <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -19,7 +19,7 @@ %define so_ver 17 Name: libupnpp -Version: 1.0.3 +Version: 1.0.4 Release: 0 Summary: Library providing a higher level API over libnpupnp or libupnp License: LGPL-2.1-or-later @@ -31,7 +31,6 @@ BuildRequires: c++_compiler BuildRequires: meson BuildRequires: pkgconfig -BuildRequires: pkgconfig(expat) BuildRequires: pkgconfig(libcurl) BuildRequires: pkgconfig(libnpupnp) >= 6.0.0 ++++++ libupnpp-1.0.3.tar.gz -> libupnpp-1.0.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/LIBUPNPP-VERSION.txt new/libupnpp-1.0.4/LIBUPNPP-VERSION.txt --- old/libupnpp-1.0.3/LIBUPNPP-VERSION.txt 2025-05-26 08:48:27.000000000 +0200 +++ new/libupnpp-1.0.4/LIBUPNPP-VERSION.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -1.0.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/avlastchg.cxx new/libupnpp-1.0.4/libupnpp/control/avlastchg.cxx --- old/libupnpp-1.0.3/libupnpp/control/avlastchg.cxx 2024-04-23 08:18:31.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/control/avlastchg.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -20,18 +20,26 @@ #include <cstring> #include "libupnpp/control/avlastchg.hxx" -#include "libupnpp/expatmm.h" #include "libupnpp/log.h" +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif + using namespace std; namespace UPnPClient { -class LastchangeParser : public inputRefXMLParser { +class LastchangeParser : public XMLPARSERTP { public: LastchangeParser(const string& input, std::unordered_map<string,string>& props) - : inputRefXMLParser(input), m_props(props) {} + : XMLPARSERTP(input), m_props(props) {} protected: void StartElement(const XML_Char* name, const XML_Char** attrs) override diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/cdircontent.cxx new/libupnpp-1.0.4/libupnpp/control/cdircontent.cxx --- old/libupnpp-1.0.3/libupnpp/control/cdircontent.cxx 2025-04-09 18:24:59.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/control/cdircontent.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -19,18 +19,25 @@ #include <cstring> -#include <unordered_map> #include <string> #include <vector> #include <iostream> #include "libupnpp/control/cdircontent.hxx" -#include "libupnpp/expatmm.h" #include "libupnpp/log.hxx" #include "libupnpp/upnpp_p.hxx" #include "libupnpp/soaphelp.hxx" #include "libupnpp/smallut.h" +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif + using namespace UPnPP; namespace UPnPClient { @@ -56,17 +63,18 @@ }; // An XML parser which builds directory contents from DIDL-lite input. -class UPnPDirParser : public inputRefXMLParser { +class UPnPDirParser : public XMLPARSERTP { public: UPnPDirParser(UPnPDirContent& dir, const std::string& input) - : inputRefXMLParser(input), m_dir(dir) { + : XMLPARSERTP(input), m_dir(dir) { //LOGDEB("UPnPDirParser: input: " << input << '\n'); } UPnPDirContent& m_dir; protected: + /* !! Beware: if changed to use the attrs, and using picoxml, need to define + PICOXML_EXPAT_STARTELEMENT_COMPAT before the picoxml.h include */ void StartElement(const XML_Char* name, const XML_Char**) override { - //LOGDEB("startElement: name [" << name << "]" << " bpos " << - // XML_GetCurrentByteIndex(expat_parser) << endl); + //LOGDEB("startElement: name [" << name << "]" << " bpos " << getCurrentByteIndex() << '\n'); auto& mapattrs = m_path.back().attributes; switch (name[0]) { case 'c': @@ -131,10 +139,15 @@ } void storeFrag(bool isContainer) { - size_t len = XML_GetCurrentByteIndex(expat_parser) - m_path.back().start_index; + auto len = getCurrentByteIndex() - m_path.back().start_index; if (len > 0) { - m_tobj.m_didlfrag = m_input.substr(m_path.back().start_index, len) + - (isContainer ? "</container>" : "</item>"); + m_tobj.m_didlfrag = m_input.substr(m_path.back().start_index, len); +#ifdef UPNPP_USE_EXPAT + // Expat returns the offset for the starting byte of the closing tag + // We could mimick this in picoxml, but why? + m_tobj.m_didlfrag += (isContainer ? "</container>" : "</item>"); +#endif + LOGDEB1("DIDLFRAG [" << m_tobj.m_didlfrag << "]\n"); } } void EndElement(const XML_Char* name) override { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/description.cxx new/libupnpp-1.0.4/libupnpp/control/description.cxx --- old/libupnpp-1.0.3/libupnpp/control/description.cxx 2025-04-23 12:41:08.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/control/description.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -27,20 +27,28 @@ #include <upnp.h> #include "libupnpp/upnpplib.hxx" -#include "libupnpp/expatmm.h" #include "libupnpp/upnpp_p.hxx" #include "libupnpp/smallut.h" #include "libupnpp/log.hxx" +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif + using namespace std; using namespace UPnPP; namespace UPnPClient { -class UPnPDeviceParser : public inputRefXMLParser { +class UPnPDeviceParser : public XMLPARSERTP { public: UPnPDeviceParser(const string& input, UPnPDeviceDesc& device) - : inputRefXMLParser(input), m_device(device) {} + : XMLPARSERTP(input), m_device(device) {} protected: void EndElement(const XML_Char* name) override @@ -139,19 +147,19 @@ // XML parser for the service description document (SCPDURL) -class ServiceDescriptionParser : public inputRefXMLParser { +class ServiceDescriptionParser : public XMLPARSERTP { public: ServiceDescriptionParser(UPnPServiceDesc::Parsed& out, const string& input) - : inputRefXMLParser(input), m_parsed(out) { + : XMLPARSERTP(input), m_parsed(out) { m_parsed.stateTable.clear(); m_parsed.actionList.clear(); } protected: - void StartElement(const XML_Char* name, const XML_Char**) override - { - //LOGDEB("startElement: name [" << name << "]" << " bpos " << - // XML_GetCurrentByteIndex(expat_parser) << endl); + /* !! Beware: if changed to use the attrs, and using picoxml, need to define + PICOXML_EXPAT_STARTELEMENT_COMPAT before the picoxml.h include */ + void StartElement(const XML_Char* name, const XML_Char**) override { + //LOGDEB("startElement: name [" << name << "]" << " bpos " << getCurrentByteIndex() << '\n'); StackEl& lastelt = m_path.back(); switch (name[0]) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohplaylist.cxx new/libupnpp-1.0.4/libupnpp/control/ohplaylist.cxx --- old/libupnpp-1.0.3/libupnpp/control/ohplaylist.cxx 2024-04-23 08:33:25.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/control/ohplaylist.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -32,11 +32,19 @@ #include "libupnpp/upnpavutils.hxx" #include "libupnpp/control/cdircontent.hxx" #include "libupnpp/control/service.hxx" -#include "libupnpp/expatmm.h" #include "libupnpp/log.hxx" #include "libupnpp/soaphelp.hxx" #include "libupnpp/upnpp_p.hxx" +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif + using namespace std; using namespace std::placeholders; using namespace UPnPP; @@ -239,10 +247,10 @@ // </TrackList> -class OHTrackListParser : public inputRefXMLParser { +class OHTrackListParser : public XMLPARSERTP { public: OHTrackListParser(const string& input, vector<OHPlaylist::TrackListEntry>* vp) - : inputRefXMLParser(input), m_v(vp) + : XMLPARSERTP(input), m_v(vp) { //LOGDEB("OHTrackListParser: input: " << input << '\n'); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohproduct.cxx new/libupnpp-1.0.4/libupnpp/control/ohproduct.cxx --- old/libupnpp-1.0.3/libupnpp/control/ohproduct.cxx 2024-04-23 08:18:31.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/control/ohproduct.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -24,12 +24,20 @@ #include <string> #include <vector> -#include "libupnpp/expatmm.h" #include "libupnpp/log.hxx" #include "libupnpp/soaphelp.hxx" #include "libupnpp/upnpp_p.hxx" #include "libupnpp/smallut.h" +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif + using namespace std::placeholders; using namespace UPnPP; @@ -52,10 +60,10 @@ // - Analog - Specifies an analog external input // - Digital - Specifies a digital external input // - Hdmi - Specifies a HDMI external input -class OHSourceParser : public inputRefXMLParser { +class OHSourceParser : public XMLPARSERTP { public: OHSourceParser(const std::string& input, std::vector<OHProduct::Source>& sources) - : inputRefXMLParser(input), m_sources(sources) {} + : XMLPARSERTP(input), m_sources(sources) {} protected: void EndElement(const XML_Char* name) override diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohradio.cxx new/libupnpp-1.0.4/libupnpp/control/ohradio.cxx --- old/libupnpp-1.0.3/libupnpp/control/ohradio.cxx 2025-03-24 12:58:42.000000000 +0100 +++ new/libupnpp-1.0.4/libupnpp/control/ohradio.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -33,9 +33,16 @@ #include "libupnpp/control/cdircontent.hxx" #include "libupnpp/control/service.hxx" #include "libupnpp/log.hxx" -#include "libupnpp/expatmm.h" #include "libupnpp/soaphelp.hxx" -#include "libupnpp/upnpp_p.hxx" + +#ifdef UPNPP_USE_EXPAT +#include "libupnpp/expatmm.h" +#define XMLPARSERTP inputRefXMLParser +#else +#define PICOXML_EXPAT_STARTELEMENT_COMPAT +#include "libupnpp/picoxml.h" +#define XMLPARSERTP PicoXMLParser +#endif using namespace std; using namespace std::placeholders; @@ -244,10 +251,10 @@ // </TrackList> -class OHTrackListParser : public inputRefXMLParser { +class OHTrackListParser : public XMLPARSERTP { public: OHTrackListParser(const string& input, vector<OHPlaylist::TrackListEntry>* vp) - : inputRefXMLParser(input), m_v(vp) + : XMLPARSERTP(input), m_v(vp) { //LOGDEB("OHTrackListParser: input: " << input << '\n'); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/service.cxx new/libupnpp-1.0.4/libupnpp/control/service.cxx --- old/libupnpp-1.0.3/libupnpp/control/service.cxx 2025-03-24 12:58:42.000000000 +0100 +++ new/libupnpp-1.0.4/libupnpp/control/service.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -168,7 +168,7 @@ std::vector<std::pair<std::string, std::string>> response; if (opts && (opts->active_options & AOM_TIMEOUTMS)) { - response.emplace_back("timeoutms", lltodecstr(opts->timeoutms)); + response.emplace_back("timeoutms", std::to_string(opts->timeoutms)); } int errcode; std::string errdesc; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/expatmm.h new/libupnpp-1.0.4/libupnpp/expatmm.h --- old/libupnpp-1.0.3/libupnpp/expatmm.h 2024-04-01 10:31:22.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/expatmm.h 2026-01-18 09:02:44.000000000 +0100 @@ -23,6 +23,7 @@ #ifndef _EXPATMM_EXPATXMLPARSER_H #define _EXPATMM_EXPATXMLPARSER_H +#include <stdio.h> #include <expat.h> #include <cstring> @@ -125,6 +126,9 @@ virtual XML_Size getLastErrorColumn(void) const { return last_error_column; } + virtual XML_Index getCurrentByteIndex(void) const { + return XML_GetCurrentByteIndex(expat_parser); + } virtual std::string getLastErrorMessage(void) const { return last_error_message; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/picoxml.h new/libupnpp-1.0.4/libupnpp/picoxml.h --- old/libupnpp-1.0.3/libupnpp/picoxml.h 1970-01-01 01:00:00.000000000 +0100 +++ new/libupnpp-1.0.4/libupnpp/picoxml.h 2026-01-18 09:02:44.000000000 +0100 @@ -0,0 +1,473 @@ +/* Copyright (C) 2016 J.F.Dockes + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * (1) Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * (2) Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * (3)The name of the author may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + **********************************************************/ + +#ifndef _PICOXML_H_INCLUDED_ +#define _PICOXML_H_INCLUDED_ + +/** + * PicoXMLParser: a single include file parser for an XML-like, but restricted language, adequate + * for config files, not for arbitrary externally generated data. + * + * - The code depends on nothing but the C++ standard library + * - The input to the parser is a single C++ string. We do not deal with + * input in several pieces or files. + * - SAX mode only. You have access to the current tag stack. + * - Checks for proper tag nesting and not much else. + * - MISSING support: + * - NO literal '>' inside attribute values. Use > + * - No CDATA support + * - No DOCTYPE support + * - No processing of namespaces. + * - Not fast: a lot of std::string and memory allocations. + * + * A typical input would be like the following (you can add XML declarations, whitespace and + * newlines to taste). + * + * <top>top chrs1<sub attr="attrval">sub chrs</sub>top chrs2 <emptyelt /></top> + * + * Usage: subclass PicoXMLParser, overriding the methods in the "protected:" section (look there + * for more details), call the constructor with your input, then call parse(). + */ + +#include <string> +#include <vector> +#include <map> +#include <sstream> +#include <iostream> + +// Expat compat +typedef char XML_Char; + +class PicoXMLParser { +public: + PicoXMLParser(const std::string& input) + : m_input(input), m_pos(0) {} + + virtual ~PicoXMLParser() = default; + PicoXMLParser(const PicoXMLParser&) = delete; + PicoXMLParser& operator=(const PicoXMLParser&) = delete; + + virtual bool parse() { + return _parse(); + } + virtual bool Parse() { + return _parse(); + } + + virtual std::string getLastErrorMessage() { + return m_reason.str(); + } + virtual std::string::size_type getCurrentByteIndex(void) { + return m_pos; + } + +protected: + + /* Methods to be overriden */ + + /** + * Tag open handler. + * @param tagname the tag name + * @param attrs a map of attribute name/value pairs + */ + virtual void startElement(const std::string& /* nm */, + const std::map<std::string, std::string>& /* attrs */) {} + /** Expatmm compat. */ + virtual void StartElement(const XML_Char *, const XML_Char **) {} + + /** + * Tag close handler. + * You should probably have been accumulating text and stuff since + * the tag opening. + * @param tagname the tag name. + */ + virtual void endElement(const std::string& /* nm */) {} + /** Expatmm compat */ + virtual void EndElement(const XML_Char * /* nm */) {} + + /** + * Non-tag data handler. + * @param data the data. + */ + virtual void characterData(const std::string& /*data*/) {} + /** Expatmm compat */ + virtual void CharacterData(const XML_Char *, int) {} + + /** + * Return current tag name stack. Deprecated, use m_path. + * This does not include the current (bottom) tag. + * Attributes are not kept in there, you'll have to do this yourself. + * @return a const ref to a vector of tag names. + */ + virtual const std::vector<std::string>& tagStack() { + return m_tagstack; + } + + /** + * Current element stack, including the bottom one + * Each entry includes the attributes and the starting character offset. + * The stack includes the last element (the one open is called for). + */ + class StackEl { + public: + StackEl(const std::string& nm) : name(nm) {} + std::string name; + std::string::size_type start_index; + std::map<std::string,std::string> attributes; + std::string data; // Derived class usage + }; + std::vector<StackEl> m_path; + + const std::string& m_input; + +private: + std::string::size_type m_pos{0}; + std::string::size_type m_tagstart{0}; + std::stringstream m_reason; + std::vector<std::string> m_tagstack; + + void _startelem(const std::string& tagname, + const std::map<std::string, std::string>& attrs, bool empty) { + m_path.emplace_back(tagname); + StackEl& lastelt = m_path.back(); + lastelt.start_index = m_tagstart; + lastelt.attributes = attrs; + + startElement(tagname, attrs); + +#ifdef PICOXML_EXPAT_STARTELEMENT_COMPAT + { // Call Expat-compatible StartElement + auto sz = 2*(attrs.size()+1); + if (m_vattrs.size() < sz) { + m_vattrs.resize(sz); + } + auto it = m_vattrs.begin(); + for (const auto& attr : attrs) { + *it++ = attr.first.c_str(); + *it++ = attr.second.c_str(); + } + *it++ = nullptr; + *it++ = nullptr; + StartElement(tagname.c_str(), m_vattrs.data()); + } +#else + StartElement(tagname.c_str(), nullptr); +#endif + + m_tagstack.push_back(tagname); // Compat + if (empty) { + _endelem(tagname); + } + } + + void _endelem(const std::string& tagname) { + m_tagstack.pop_back(); + endElement(tagname); + EndElement(tagname.c_str()); + m_path.pop_back(); + } + + bool _parse() { + // skip initial whitespace and XML decl. On success, returns with + // current pos on first tag '<' + if (!skipDecl()) { + return false; + } + if (nomore()) { + // empty file + return true; + } + + for (;;) { + // Current char is '<' and the next char is not '?' + //std::cerr << "m_pos " << m_pos << " char " << m_input[m_pos] << "\n"; + // skipComment also processes + bool wascomment; + if (!skipComment(wascomment)) { + return false; + } + if (nomore()) { + if (!m_tagstack.empty()) { + m_reason << "EOF hit inside open element at cpos " << m_pos; + return false; + } + return true; + } + if (wascomment) + continue; + m_tagstart = m_pos; + m_pos++; + if (nomore()) { + m_reason << "EOF within tag"; + return false; + } + std::string::size_type spos = m_pos; + int isendtag = m_input[m_pos] == '/' ? 1 : 0; + + skipStr(">"); + if (m_pos == std::string::npos || m_pos <= spos + 1) { + m_reason << "Empty tag or EOF inside tag. pos " << spos; + return false; + } + + int emptyel = m_input[m_pos-2] == '/' ? 1 : 0; + if (emptyel && isendtag) { + m_reason << "Bad tag </xx/> at cpos " << spos; + return false; + } + + std::string tag = m_input.substr(spos + isendtag, m_pos - (spos + 1 + isendtag + emptyel)); + //std::cerr << "TAG NAME [" << tag << "]\n"; + trimtag(tag); + std::map<std::string, std::string> attrs; + if (!parseattrs(tag, attrs)) { + return false; + } + if (isendtag) { + if (m_tagstack.empty() || tag.compare(m_tagstack.back())) { + m_reason << "Closing not open tag " << tag << " at cpos " << m_pos; + return false; + } + _endelem(tag); + } else { + _startelem(tag, attrs, emptyel); + } + if (!_chardata()) { + return false; + } + } + return false; + } + + bool _chardata() { + std::string::size_type spos = m_pos; + m_pos = m_input.find("<", m_pos); + if (nomore()) { + return true; + } + if (m_pos != spos) { + std::string data{unQuote(m_input.substr(spos, m_pos - spos))}; + if (m_unquoteError) { + return false; + } + characterData(data); + CharacterData(data.c_str(), static_cast<int>(data.size())); + } + return true; + } + + bool nomore(int sz = 0) const { + return m_pos == std::string::npos || m_pos >= m_input.size() - sz; + } + bool skipWS(const std::string& in, std::string::size_type& pos) { + if (pos == std::string::npos) + return false; + pos = in.find_first_not_of(" \t\n\r", pos); + return pos != std::string::npos; + } + bool skipStr(const std::string& str) { + if (m_pos == std::string::npos) + return false; + m_pos = m_input.find(str, m_pos); + if (m_pos != std::string::npos) + m_pos += str.size(); + return m_pos != std::string::npos; + } + int peek(int sz = 0) const { + if (nomore(sz)) + return -1; + return m_input[m_pos + 1 + sz]; + } + void trimtag(std::string& tag) { + auto trimpos = tag.find_last_not_of(" \t\n\r"); + if (trimpos != std::string::npos) + tag.resize(trimpos + 1); + } + + bool skipDecl() { + for (;;) { + if (!skipWS(m_input, m_pos)) { + m_reason << "EOF during initial ws skip"; + return true; + } + if (m_input[m_pos] != '<') { + m_reason << "EOF file does not begin with decl/tag: m_pos " << + m_pos << " char [" << m_input[m_pos] << "]\n"; + return false; + } + if (peek() == '?') { + if (!skipStr("?>")) { + m_reason << "EOF while looking for end of xml decl"; + return false; + } + } else { + break; + } + } + return true; + } + + bool skipComment(bool& wascomment) { + wascomment = false; + if (nomore()) { + return true; + } + if (m_input[m_pos] != '<') { + m_reason << "Internal error: skipComment called with wrong " + "start: m_pos " << m_pos << " char [" << m_input[m_pos] << "]\n"; + return false; + } + if (peek() == '!' && peek(1) == '-' && peek(2) == '-') { + if (!skipStr("-->")) { + m_reason << "EOF while looking for end of XML comment"; + return false; + } + // Process possible characters until next tag + wascomment = true; + return _chardata(); + } + return true; + } + + bool parseattrs(std::string& tag, std::map<std::string, std::string>& attrs) { + //std::cerr << "parseattrs: [" << tag << "]\n"; + attrs.clear(); + std::string::size_type spos = tag.find_first_of(" \t\n\r"); + if (spos == std::string::npos) + return true; + std::string tagname = tag.substr(0, spos); + //std::cerr << "tag name [" << tagname << "] pos " << spos << "\n"; + skipWS(tag, spos); + + for (;;) { + //std::cerr << "top of loop [" << tag.substr(spos) << "]\n"; + std::string::size_type epos = tag.find_first_of(" \t\n\r=", spos); + if (epos == std::string::npos) { + m_reason << "Bad attributes syntax at cpos " << m_pos + epos; + return false; + } + std::string attrnm = tag.substr(spos, epos - spos); + if (attrnm.empty()) { + m_reason << "Empty attribute name ?? at cpos " << m_pos + epos; + return false; + } + //std::cerr << "attr name [" << attrnm << "]\n"; + skipWS(tag, epos); + if (epos == std::string::npos || epos == tag.size() - 1 || + tag[epos] != '=') { + m_reason <<"Missing equal sign or value at cpos " << m_pos+epos; + return false; + } + epos++; + skipWS(tag, epos); + char qc{0}; + if ((tag[epos] != '"' && tag[epos] != '\'') || + epos == tag.size() - 1) { + m_reason << "Missing quote or value at cpos " << m_pos+epos; + return false; + } + qc = tag[epos]; + spos = epos + 1; + epos = tag.find_first_of(qc, spos); + if (epos == std::string::npos) { + m_reason << "Missing closing quote at cpos " << m_pos+spos; + return false; + } + attrs[attrnm] = unQuote(tag.substr(spos, epos - spos)); + if (m_unquoteError) { + return false; + } + //std::cerr << "attr value [" << attrs[attrnm] << "]\n"; + if (epos == tag.size() - 1) { + break; + } + epos++; + skipWS(tag, epos); + if (epos == tag.size() - 1) { + break; + } + spos = epos; + } + tag = tagname; + return true; + } + + std::string unQuote(const std::string &s) { + static const std::string e_quot{"quot"}; + static const std::string e_amp{"amp"}; + static const std::string e_apos{"apos"}; + static const std::string e_lt{"lt"}; + static const std::string e_gt{"gt"}; + + m_unquoteError = false; + std::string out; + out.reserve(s.size()); + std::string::const_iterator it = s.begin(); + std::string::size_type epos = 0; + while (it != s.end()) { + if (*it != '&') { + out += *it++; + continue; + } + // Position: m_pos minus the string size (including 2 quotes) plus position inside s + epos = m_pos - (s.size() + 2) + it - s.begin(); + ++it; + std::string code; + while (it != s.end() && *it != ';') { + code += *it++; + } + if (it == s.end()) { + // Unexpected + m_reason << "End of quoted string, inside entity name at cpos " << epos; + m_unquoteError = true; + out.clear(); + break; + } + ++it; + if (code == e_quot) { + out += '"'; + } else if (code == e_amp) { + out += '&'; + } else if (code == e_apos) { + out += '\''; + } else if (code == e_lt) { + out += '<'; + } else if (code == e_gt) { + out += '>'; + } + } + return out; + } + + std::vector<const char *> m_vattrs; + bool m_unquoteError; +}; +#endif /* _PICOXML_H_INCLUDED_ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/smallut.cpp new/libupnpp-1.0.4/libupnpp/smallut.cpp --- old/libupnpp-1.0.3/libupnpp/smallut.cpp 2025-04-28 14:06:58.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/smallut.cpp 2026-01-18 09:02:44.000000000 +0100 @@ -30,8 +30,8 @@ #include <list> #include <map> #include <set> -#include <unordered_set> #include <string> +#include <unordered_set> #include <utility> #include <vector> @@ -451,28 +451,43 @@ return s; } -template <class T> std::string commonprefix(const T& values) +std::string commonprefix(const std::string& curpfx, const std::string& value, bool aspaths) +{ + if (curpfx.empty()) { + return value; + } + auto prefix = curpfx; + while (value.compare(0, prefix.size(), prefix)) { + // If the prefix has an ending / and the value is identical with no / keep the longer + if (aspaths && prefix.back() == '/' && !prefix.compare(0, prefix.size()-1, value)) { + break; + } + prefix.pop_back(); + if (prefix.empty()) + return {}; + } + if (aspaths && + value.size() > prefix.size() && prefix.back() != '/' && value[prefix.size()] == '/') { + prefix += '/'; + } + + return prefix; +} + +template <class T> std::string commonprefix(const T& values, bool aspaths) { if (values.empty()) return {}; if (values.size() == 1) return *values.begin(); - unsigned int i = 0; - for (;;++i) { - auto it = values.begin(); - if (it->size() <= i) { - goto out; - } - auto val = (*it)[i]; - it++; - for (;it < values.end(); it++) { - if (it->size() <= i || (*it)[i] != val) { - goto out; - } - } + std::string prefix; + // Look at all input strings + for (const auto& value : values) { + prefix = commonprefix(prefix, value, aspaths); + if (prefix.empty()) + return std::string(); } -out: - return values.begin()->substr(0, i); + return prefix; } #ifdef SMALLUT_EXTERNAL_INSTANTIATIONS @@ -499,7 +514,8 @@ const std::unordered_set<std::string>&); template std::string stringsToCSV<std::list<std::string>>(const std::list<std::string>&, char); template std::string stringsToCSV<std::vector<std::string>>(const std::vector<std::string>&, char); -template std::string commonprefix<std::vector<std::string>>(const std::vector<std::string>&values); +template std::string commonprefix<std::vector<std::string>>(const std::vector<std::string>&values, + bool aspaths); #endif void stringToTokens(const std::string& str, std::vector<std::string>& tokens, @@ -825,65 +841,6 @@ return pcSubst(in, out, std::bind(&PcSubstMapMapper::domap, &mapper, _1)); } -void ulltodecstr(uint64_t val, std::string& buf) -{ - buf.clear(); - if (val == 0) { - buf = "0"; - return; - } - - char rbuf[30]; - int idx=29; - rbuf[idx--] = 0; - do { - rbuf[idx--] = '0' + val % 10; - val /= 10; - } while (val); - - buf.assign(&rbuf[idx+1]); -} - -void lltodecstr(int64_t val, std::string& buf) -{ - buf.clear(); - if (val == 0) { - buf = "0"; - return; - } - - bool neg = val < 0; - if (neg) { - val = -val; - } - - char rbuf[30]; - int idx=29; - rbuf[idx--] = 0; - do { - rbuf[idx--] = '0' + val % 10; - val /= 10; - } while (val); - if (neg) { - rbuf[idx--] = '-'; - } - buf.assign(&rbuf[idx+1]); -} - -std::string lltodecstr(int64_t val) -{ - std::string buf; - lltodecstr(val, buf); - return buf; -} - -std::string ulltodecstr(uint64_t val) -{ - std::string buf; - ulltodecstr(val, buf); - return buf; -} - // Convert byte count into unit (KB/MB...) appropriate for display std::string displayableBytes(int64_t size) { @@ -904,7 +861,7 @@ roundable = double(size) / 1E9; } size = int64_t(std::round(roundable)); - return lltodecstr(size).append(unit); + return std::to_string(size).append(unit); } std::string breakIntoLines(const std::string& in, unsigned int ll, unsigned int maxlines) @@ -1286,6 +1243,46 @@ return true; } + + +// Extract a numeric part from an alphanumeric string +static bool extractNumber(const std::string &s, size_t &i, int &num) +{ + if (i >= s.size()) return false; + size_t start = i; +// if (s[start] == '0' && start + 1 < s.size() && isdigit(s[start + 1])) { + // Handle leading zeros if needed +// } + while (i < s.size() && isdigit(s[i])) i++; + if (i == start) return false; + num = std::stoi(s.substr(start, i - start)); + return true; +} + +// Custom comparator for sorting alphanumeric strings with natural sorting of the numeric parts +static bool naturalCompare(const std::string &a, const std::string &b) +{ + size_t i = 0, j = 0; + while (i < a.size() && j < b.size()) { + if (isdigit(a[i]) && isdigit(b[j])) { + int numA, numB; + extractNumber(a, i, numA); + extractNumber(b, j, numB); + if (numA != numB) return numA < numB; + } else { + if (a[i] != b[j]) return a[i] < b[j]; + i++; j++; + } + } + return a.size() < b.size(); +} + +void sortAlphanumStrings(std::vector<std::string> & strings) +{ + std::sort(strings.begin(), strings.end(), naturalCompare); +} + + void millisleep(int millis) { #ifdef _WIN32 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/smallut.h new/libupnpp-1.0.4/libupnpp/smallut.h --- old/libupnpp-1.0.3/libupnpp/smallut.h 2025-04-27 08:40:40.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/smallut.h 2026-02-10 17:24:58.000000000 +0100 @@ -86,6 +86,9 @@ extern void stringtoupper(std::string& io); extern std::string stringtoupper(const std::string& io); extern bool beginswith(const std::string& b, const std::string& sml); +inline bool startswith(const std::string& b, const std::string& sml) { + return beginswith(b, sml); +} extern bool endswith(const std::string& bg, const std::string& sml); #ifdef _WIN32 @@ -136,7 +139,11 @@ template <class T> std::string stringsToCSV(const T& tokens, char sep = ','); /** Find longest common prefix for bunch of strings */ -template <class T> std::string commonprefix(const T& values); +template <class T> std::string commonprefix(const T& values, bool aspaths = false); + +/** Same, progressive way. Initially call with curpfx=="". Returns newprefix. + *** If the return value is empty, STOP CALLING ***, else we start again with the next value. */ +std::string commonprefix(const std::string& curpfx, const std::string& value, bool aspaths); /** * Split input string. No handling of quoting. @@ -182,11 +189,6 @@ /** Truncate a string to a given maxlength, avoiding cutting off midword if reasonably possible. */ extern std::string truncate_to_word(const std::string& input, std::string::size_type maxlen); -void ulltodecstr(uint64_t val, std::string& buf); -void lltodecstr(int64_t val, std::string& buf); -std::string lltodecstr(int64_t val); -std::string ulltodecstr(uint64_t val); - /** Convert byte count into unit (KB/MB...) appropriate for display */ std::string displayableBytes(int64_t size); @@ -292,6 +294,9 @@ /// Decode percent-encoded string extern std::string pc_decode(const std::string&); +/// Sort alphanumeric strings with integer ordering for the numeric parts. +extern void sortAlphanumStrings(std::vector<std::string> &strings); + /// Parse HTTP range header value into a vector of offset pairs. -1 is used as a placeholder /// wherever a part of a range is absent: either for a missing end or for a suffix range (absent /// start meaning count from the end). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/upnpplib.cxx new/libupnpp-1.0.4/libupnpp/upnpplib.cxx --- old/libupnpp-1.0.3/libupnpp/upnpplib.cxx 2025-05-26 08:47:32.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/upnpplib.cxx 2026-01-18 09:02:44.000000000 +0100 @@ -319,7 +319,7 @@ string LibUPnP::port() { unsigned short prt = UpnpGetServerPort(); - return ulltodecstr(prt); + return std::to_string(prt); } int LibUPnP::Internal::setupWebServer(const string& description, UpnpDevice_Handle *dvh) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/upnpplib.hxx new/libupnpp-1.0.4/libupnpp/upnpplib.hxx --- old/libupnpp-1.0.3/libupnpp/upnpplib.hxx 2025-05-26 08:48:35.000000000 +0200 +++ new/libupnpp-1.0.4/libupnpp/upnpplib.hxx 2026-03-20 09:33:25.000000000 +0100 @@ -26,7 +26,7 @@ /** Version components. */ #define LIBUPNPP_VERSION_MAJOR 1 #define LIBUPNPP_VERSION_MINOR 0 -#define LIBUPNPP_VERSION_REVISION 3 +#define LIBUPNPP_VERSION_REVISION 4 /// Got this from Xapian... #define LIBUPNPP_AT_LEAST(A,B,C) \ (LIBUPNPP_VERSION_MAJOR > (A) || \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/meson.build new/libupnpp-1.0.4/meson.build --- old/libupnpp-1.0.3/meson.build 2025-05-26 08:48:35.000000000 +0200 +++ new/libupnpp-1.0.4/meson.build 2026-03-20 09:33:25.000000000 +0100 @@ -2,7 +2,7 @@ 'libupnpp', 'cpp', license: 'LGPL 2.1+', - version: '1.0.3', # VERSIONCOMMENT keep this here, used by setversion.sh + version: '1.0.4', # VERSIONCOMMENT keep this here, used by setversion.sh default_options: ['cpp_std=c++17', 'buildtype=debugoptimized'], meson_version: '>=0.49', ) @@ -25,7 +25,10 @@ deps += dependency('threads') deps += dependency('libnpupnp') deps += dependency('libcurl') -deps += dependency('expat') +if get_option('use_expat') + deps += dependency('expat') + add_project_arguments('-DUPNPP_USE_EXPAT', language: 'cpp') +endif # Note: meson sets -D_FILE_OFFSET_BITS=64 by default if get_option('default_library') != 'static' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/meson_options.txt new/libupnpp-1.0.4/meson_options.txt --- old/libupnpp-1.0.3/meson_options.txt 2024-04-01 10:14:13.000000000 +0200 +++ new/libupnpp-1.0.4/meson_options.txt 2026-01-18 09:02:44.000000000 +0100 @@ -1,3 +1,3 @@ -option('expat', type : 'feature', - description : 'Use expat', +option('use_expat', type : 'boolean', value: 'false', + description : 'Use expat instead of picoxml', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/qmk/config.h new/libupnpp-1.0.4/qmk/config.h --- old/libupnpp-1.0.3/qmk/config.h 2025-05-26 08:48:35.000000000 +0200 +++ new/libupnpp-1.0.4/qmk/config.h 2026-03-20 09:33:25.000000000 +0100 @@ -3,6 +3,6 @@ // This is only used with qmake on Windows and MacOS with qmake (it is generated by meson in the // build dir). -#define LIBUPNPP_VERSION "1.0.3" +#define LIBUPNPP_VERSION "1.0.4" #endif // _LIBUPNPPCONFIG_H_INCLUDED diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libupnpp-1.0.3/qmk/libupnpp.pro.user new/libupnpp-1.0.4/qmk/libupnpp.pro.user --- old/libupnpp-1.0.3/qmk/libupnpp.pro.user 2023-10-11 10:48:22.000000000 +0200 +++ new/libupnpp-1.0.4/qmk/libupnpp.pro.user 1970-01-01 01:00:00.000000000 +0100 @@ -1,406 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 10.0.1, 2023-08-31T17:53:24. --> -<qtcreator> - <data> - <variable>EnvironmentId</variable> - <value type="QByteArray">{8650a31b-ca0b-4a0b-b764-066b30ac029a}</value> - </data> - <data> - <variable>ProjectExplorer.Project.ActiveTarget</variable> - <value type="qlonglong">0</value> - </data> - <data> - <variable>ProjectExplorer.Project.EditorSettings</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="EditorConfiguration.AutoIndent">true</value> - <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> - <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> - <value type="QString" key="language">Cpp</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> - </valuemap> - </valuemap> - <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value> - <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> - <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> - <value type="int" key="EditorConfiguration.IndentSize">4</value> - <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> - <value type="int" key="EditorConfiguration.MarginColumn">80</value> - <value type="bool" key="EditorConfiguration.MouseHiding">true</value> - <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> - <value type="int" key="EditorConfiguration.PaddingMode">1</value> - <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value> - <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> - <value type="bool" key="EditorConfiguration.ShowMargin">false</value> - <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> - <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> - <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> - <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> - <value type="int" key="EditorConfiguration.TabSize">8</value> - <value type="bool" key="EditorConfiguration.UseGlobal">true</value> - <value type="bool" key="EditorConfiguration.UseIndenter">false</value> - <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> - <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> - <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> - <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> - <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> - <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> - <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> - <value type="bool" key="EditorConfiguration.tintMarginArea">true</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.PluginSettings</variable> - <valuemap type="QVariantMap"> - <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"> - <value type="QString">-fno-delayed-template-parsing</value> - </valuelist> - <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value> - <value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value> - <valuemap type="QVariantMap" key="ClangTools"> - <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value> - <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value> - <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value> - <value type="int" key="ClangTools.ParallelJobs">2</value> - <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/> - <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/> - <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/> - <value type="bool" key="ClangTools.UseGlobalSettings">true</value> - </valuemap> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.Target.0</variable> - <valuemap type="QVariantMap"> - <value type="QString" key="DeviceType">Desktop</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.5.2 MSVC2019 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.5.2 MSVC2019 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.652.win64_msvc2019_64_kit</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> - <value type="int" key="EnableQmlDebugging">0</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Debug</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Debug</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Release</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Release</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> - <value type="int" key="QtQuickCompiler">0</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> - <value type="int" key="EnableQmlDebugging">0</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Profile</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Profile</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> - <value type="int" key="QtQuickCompiler">0</value> - <value type="int" key="SeparateDebugInfo">0</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> - <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> - <valuelist type="QVariantList" key="CustomOutputParsers"/> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value> - <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.Target.1</variable> - <valuemap type="QVariantMap"> - <value type="QString" key="DeviceType">Desktop</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win32_msvc2019_kit</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> - <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> - <value type="int" key="EnableQmlDebugging">0</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> - <value type="int" key="QtQuickCompiler">0</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> - <value type="int" key="EnableQmlDebugging">0</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> - <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> - <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> - <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> - <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> - <value type="int" key="QtQuickCompiler">0</value> - <value type="int" key="SeparateDebugInfo">0</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> - <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> - <valuelist type="QVariantList" key="CustomOutputParsers"/> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value> - <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - </valuemap> - <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.TargetCount</variable> - <value type="qlonglong">2</value> - </data> - <data> - <variable>ProjectExplorer.Project.Updater.FileVersion</variable> - <value type="int">22</value> - </data> - <data> - <variable>Version</variable> - <value type="int">22</value> - </data> -</qtcreator>
