Esempio n. 1
0
int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    QStringList args = app.arguments();
    QFile vcf, xml;

    if (args.count() > 1) {
        vcf.setFileName(args[1]);

        if (not vcf.open(QFile::ReadOnly)) {
            qWarning("Cannot open %s for reading: %s",
                     qPrintable(vcf.fileName()),
                     qPrintable(vcf.errorString()));
            return 1;
        }
    } else {
        if (not vcf.open(stdin, QFile::ReadOnly)) {
            qWarning("Cannot open STDIN for reading: %s",
                     qPrintable(vcf.errorString()));
            return 1;
        }
    }

    QVersitReader reader(&vcf);

    if (not reader.startReading() ||
        not reader.waitForFinished() ||
        QVersitReader::NoError != reader.error()) {
        qWarning("Cannot read vcard: rc=%d", reader.error());
        return 1;
    }

    QVersitContactImporter importer;

    if (not importer.importDocuments(reader.results())) {
        typedef QMap<int, QVersitContactImporter::Error> ErrorMap;
        const ErrorMap errors = importer.errors();

        for(ErrorMap::ConstIterator it = errors.constBegin(); it != errors.constEnd(); ++it) {
            qWarning("Cannot convert contact #%d: %d", it.key(), it.value());
        }

        return 1;
    }

    if (args.count() > 2) {
        xml.setFileName(args[2]);

        if (not xml.open(QFile::WriteOnly)) {
            qWarning("Cannot open %s for writing: %s",
                     qPrintable(xml.fileName()),
                     qPrintable(xml.errorString()));
            return 1;
        }
    } else {
        if (not xml.open(stdout, QFile::WriteOnly)) {
            qWarning("Cannot open STDIN for writing: %s",
                     qPrintable(xml.errorString()));
            return 1;
        }
    }

    QTextStream out(&xml);
    out << "<Contacts>\n";

    foreach(const QContact &contact, importer.contacts()) {
        out << "  <Contact id=\"" << makeIri(contact) << "\">\n";

        foreach(const QContactDetail &detail, contact.details()) {
            QVariantMap fields = detail.variantValues();

            out << "    <" << detail.definitionName();

            if (not detail.detailUri().isEmpty()) {
                out << " id=\"" << detail.detailUri() << "\"";
            }

            out << ">";

            if (fields.count() > 1 || fields.keys().first() != detail.definitionName()) {
                QVariantMap::ConstIterator it;

                for(it = fields.constBegin(); it != fields.constEnd(); ++it) {
                    out << "\n      ";
                    out << "<" << it.key() << ">";
                    out << toString(it.value());
                    out << "</" << it.key() << ">";
                }

                out << "\n    ";
            } else {
                out << toString(fields.values().first());
            }

            out << "</" << detail.definitionName() << ">\n";
        }

        out << "  </Contact>\n";
    }

    out << "</Contacts>\n";

    return 0;
}