Switch to side-by-side view

--- a/upadapt/upputils.cpp
+++ b/upadapt/upputils.cpp
@@ -15,6 +15,7 @@
  *	 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
 #include <string>
+#include <set>
 using namespace std;
 
 #include <QString>
@@ -88,3 +89,71 @@
     mdp->albumArtURI = uf2qs(dop, "upnp:albumArtURI", false);
     return true;
 }
+
+static std::set<string> specfields{"upnp:artist", "upnp:album", "upnp:genre",
+        "upnp:albumArtURI", "upnp:originalTrackNumber"};
+
+void metaDataToHtml(const MetaData* metap, QString& html)
+{
+    // We reparse from didl because we want to catch everything, even
+    // what does not go into the MetaData fields. Also it may happen
+    // that we have something in MetaData which does not come from the
+    // Didl data
+    
+    UPnPDirContent dir;
+    UPnPDirObject dirent;
+    bool okdidl(true);
+    // qDebug() << "metaDataToHtml: DIDL: " << metap->didl;
+    if (metap->didl.isEmpty() || !dir.parse(qs2utf8s(metap->didl)) ||
+        dir.m_items.empty()) {
+        okdidl = false;
+        //qDebug() << "metaDataToHtml: no DIDL data or no items";
+    } else {
+        //qDebug() << "metaDataToHtml: DIDL parsed ok";
+        dirent = dir.m_items[0];
+    }
+    html = "";
+    QString val;
+
+    // Some fields are treated specially (see specfields list above),
+    // because we want them in order.
+    val = okdidl ? u8s2qs(dirent.m_title) : metap->title;
+    if (!val.isEmpty()) html += "<p>" + val + "</p>";
+
+    val = okdidl ? u8s2qs(dirent.f2s("upnp:artist", false)) : metap->artist;
+    if (!val.isEmpty()) html += "<p>" + val + "</p>";
+    
+    val = okdidl ? u8s2qs(dirent.f2s("upnp:album", false)) : metap->album;
+    if (!val.isEmpty()) html += "<p>" + val + "</p>";
+
+    val = okdidl ? u8s2qs(dirent.f2s("upnp:genre", false)) :
+        (metap->genres.size() ? metap->genres[0]: QString());
+    if (!val.isEmpty()) html += "<b>Genre: </b>" + val + "<br/>";
+    val = okdidl?u8s2qs(dirent.f2s("upnp:originalTrackNumber", false)) : "";
+    if (!val.isEmpty()) html += "<b>Original track number:</b> " + val + "<br/>";
+
+    if (okdidl) {
+        // Dump all the rest
+        for (auto it : dirent.m_props) {
+            if (specfields.find(it.first) == specfields.end() &&
+                !it.second.empty()) {
+                html += "<b>" + u8s2qs(it.first) + "</b> : " +
+                    u8s2qs(it.second) + "<br/>";
+            }
+        }
+        val = u8s2qs(dirent.f2s("upnp:albumArtURI", false));
+        if (!val.isEmpty()) html += "<b>Album Art URI</b>: " + val + "<br/>";
+
+        for (auto resit : dirent.m_resources) {
+            html += "<p><b>Resource URI:</b> " + u8s2qs(resit.m_uri) + "<br/>";
+            html += "<blockquote>";
+            for (auto it : resit.m_props) {
+                html += "<b>" + u8s2qs(it.first) + "</b> : " +
+                    u8s2qs(it.second) + "<br/>";
+            }
+            html += "</blockquote></p>";
+        }
+    }
+    // qDebug() << "metaDataToHtml: html now: " << html;
+}
+