summaryrefslogblamecommitdiffstats
path: root/src/util/serviceDiscoveryUtil.cpp
blob: 32aa0fc14f1fb420eb855fd8f6b2cd3cb5620ed8 (plain) (tree)
































































                                                                                  
#include "serviceDiscoveryUtil.h"
#include <cassert>

void appendSdField(QByteArray* target, const char* id, QString data)
{
    assert(strlen(id) == 3);
    target->append(id);
    QByteArray tmp = data.toUtf8();
    if (tmp.size() > 100) tmp.truncate(100);
    target->append((char)tmp.size());
    target->append(tmp);
}

SdFields parseSdFields(unsigned char* data, int len)
{
    SdFields fields;
    for (;;)
    {
        //printf("%d bytes left: %s\n", len, (char*)data);
        if (len < 4 || len < 4 + data[3]) break; // end of data
        QString key = QString::fromUtf8((char*)data, 3);
        QString val = QString::fromUtf8((char*)data+4, data[3]);
        //printf("Key: %s, Val: %s\n", key.toUtf8().data(), val.toUtf8().data());
        fields.insert(key, val);
        len -= (4 + data[3]);
        data += (4 + data[3]);
    }
    return fields;
}

QString sha1ToReadable(QByteArray input)
{
    unsigned char *ptr = (unsigned char *)input.data();
    QString retval;
    for (int i = (input.length() < 10 ? input.length() : 10); i; --i)
    {
        switch(*ptr++ % 0xD)
        {
            case 0x0: retval.append('S'); break;
            case 0x1: retval.append('F'); break;
            case 0x2: retval.append('M'); break;
            case 0x3: retval.append('K'); break;
            case 0x4: retval.append('H'); break;
            case 0x5: retval.append('T'); break;
            case 0x6: retval.append('P'); break;
            case 0x7: retval.append('D'); break;
            case 0x8: retval.append('Y'); break;
            case 0x9: retval.append('W'); break;
            case 0xA: retval.append('G'); break;
            case 0xB: retval.append('L'); break;
            case 0xC: retval.append('B'); break;
        }
        if (--i == 0) break;
        switch((*ptr >> 2) % 5)
        {
            case 0: retval.append('a'); break;
            case 1: retval.append('i'); break;
            case 2: retval.append('u'); break;
            case 3: retval.append('e'); break;
            case 4: retval.append('o'); break;
        }
        if ((*ptr++ & 3) == 0) retval.append('n');
    }
    return retval;
}