bool Hdmi::demarshall(Status &rv, const struct _json_value *jv) { demarshall(rv.in, &(*jv)["in"]); demarshall(rv.out, &(*jv)["out"]); rv.edid = strdup((const char *)(*jv)["edid"]); rv.format = strdup((const char *)(*jv)["format"]); rv.iftv = (unsigned)(*jv)["iftv"]; rv.ifdata = strdup((const char *)(*jv)["ifdata"]); return true; }
ApiStatus Hdmi::status(Status & rv) { ApiStatus arv = api_Success; std::map<std::string,std::string> p; struct _json_value *rsp; m_rest.invoke(rsp, "Hdmi", "status", p); const char *st = rsp ? (const char *)(*rsp)["status"] : 0; if (st && strcmp(st, "Ok")==0) { demarshall(rv, &(*rsp)["v"]); } else { fprintf(stderr, "status: error %s\n", st); // error } if (rsp) json_value_free(rsp); return arv; }
QVariant QXmppRpcMarshaller::demarshall(const QDomElement &elem, QStringList &errors) { if ( elem.tagName().toLower() != "value" ) { errors << "Bad param value"; return QVariant(); } if ( !elem.firstChild().isElement() ) { return QVariant( elem.text() ); } const QDomElement typeData = elem.firstChild().toElement(); const QString typeName = typeData.tagName().toLower(); if (typeName == "nil") { return QVariant(); } if ( typeName == "string" ) { return QVariant( typeData.text() ); } else if (typeName == "int" || typeName == "i4" ) { bool ok = false; QVariant val( typeData.text().toInt( &ok ) ); if (ok) return val; errors << "I was looking for an integer but data was courupt"; return QVariant(); } else if( typeName == "double" ) { bool ok = false; QVariant val( typeData.text().toDouble( &ok ) ); if (ok) return val; errors << "I was looking for an double but data was corrupt"; } else if( typeName == "boolean" ) return QVariant( typeData.text() == "1" || typeData.text().toLower() == "true" ); else if( typeName == "datetime" || typeName == "datetime.iso8601" ) return QVariant( QDateTime::fromString( typeData.text(), Qt::ISODate ) ); else if( typeName == "array" ) { QVariantList arr; QDomElement valueNode = typeData.firstChildElement("data").firstChildElement(); while (!valueNode.isNull() && errors.isEmpty()) { arr.append(demarshall(valueNode, errors)); valueNode = valueNode.nextSiblingElement(); } return QVariant( arr ); } else if( typeName == "struct" ) { QMap<QString,QVariant> stct; QDomNode valueNode = typeData.firstChild(); while(!valueNode.isNull() && errors.isEmpty()) { const QDomElement memberNode = valueNode.toElement().elementsByTagName("name").item(0).toElement(); const QDomElement dataNode = valueNode.toElement().elementsByTagName("value").item(0).toElement(); stct[ memberNode.text() ] = demarshall(dataNode, errors); valueNode = valueNode.nextSibling(); } return QVariant(stct); } else if( typeName == "base64" ) { QVariant returnVariant; QByteArray dest; QByteArray src = typeData.text().toLatin1(); return QVariant(QByteArray::fromBase64(src)); } errors << QString( "Cannot handle type %1").arg(typeName); return QVariant(); }