bool MetaInfo::parse(const QByteArray &data)
 {
     clear();
     content = data;

     BencodeParser parser;
     if (!parser.parse(content)) {
         errString = parser.errorString();
         return false;
     }

     infoData = parser.infoSection();

     QMap<QByteArray, QVariant> dict = parser.dictionary();
     if (!dict.contains("info"))
         return false;

     QMap<QByteArray, QVariant> info = qVariantValue<Dictionary>(dict.value("info"));

     if (info.contains("files")) {
         metaInfoFileForm = MultiFileForm;

         QList<QVariant> files = info.value("files").toList();

         for (int i = 0; i < files.size(); ++i) {
             QMap<QByteArray, QVariant> file = qVariantValue<Dictionary>(files.at(i));
             QList<QVariant> pathElements = file.value("path").toList();
             QList<QString> Directories;
             QByteArray path;
             QString filename;
             int iSize = pathElements.size();
             if (iSize > 0)
             {
                 filename = QString::fromUtf8(pathElements.at(iSize - 1).toByteArray());
                 pathElements.erase(pathElements.end() - 1);
             }
             foreach (QVariant p, pathElements) {
                 if (!path.isEmpty())
                 {
                     path += "/";
                 }
                 path += p.toByteArray();
                 Directories << QString::fromUtf8(p.toByteArray());
             }

             MetaInfoMultiFile multiFile;
             multiFile.length = file.value("length").toLongLong();
             multiFile.path = QString::fromUtf8(path);
             multiFile.filename = filename;
             multiFile.md5sum = file.value("md5sum").toByteArray();
             multiFile.Directories = Directories;
             metaInfoMultiFiles << multiFile;
         }

         metaInfoName = QString::fromUtf8(info.value("name").toByteArray());
         metaInfoPieceLength = info.value("piece length").toInt();
         QByteArray pieces = info.value("pieces").toByteArray();
         for (int i = 0; i < pieces.size(); i += 20)
             metaInfoSha1Sums << pieces.mid(i, 20);
     } else if (info.contains("length")) {
Esempio n. 2
0
 bool MetaInfo::parse(const QByteArray &data)
 {
     clear();
     content = data;

     BencodeParser parser;
     if (!parser.parse(content)) {
         errString = parser.errorString();
         return false;
     }

     infoData = parser.infoSection();

     QMap<QByteArray, QVariant> dict = parser.dictionary();
     if (!dict.contains("info"))
         return false;

	 QMap<QByteArray, QVariant> info = dict.value("info").value<Dictionary>();

     if (info.contains("files")) {
         metaInfoFileForm = MultiFileForm;

         QList<QVariant> files = info.value("files").toList();

         for (int i = 0; i < files.size(); ++i) {
			 QMap<QByteArray, QVariant> file = files.at(i).value<Dictionary>();
             QList<QVariant> pathElements = file.value("path").toList();
             QByteArray path;
             foreach (QVariant p, pathElements) {
                 if (!path.isEmpty())
                     path += "/";
                 path += p.toByteArray();
             }

             MetaInfoMultiFile multiFile;
             multiFile.length = file.value("length").toLongLong();
             metaInfoMultiFiles << multiFile;
         }

     } else if (info.contains("length")) {
Esempio n. 3
0
void TrackerClient::httpRequestDone(bool error)
{
    if (lastTrackerRequest) {
        emit stopped();
        return;
    }

    if (error) {
        emit connectionError(http.error());
        return;
    }

    QByteArray response = http.readAll();
    http.abort();

    BencodeParser parser;
    if (!parser.parse(response)) {
        qWarning("Error parsing bencode response from tracker: %s",
                 qPrintable(parser.errorString()));
        http.abort();
        return;
    }

    QMap<QByteArray, QVariant> dict = parser.dictionary();

    if (dict.contains("failure reason")) {
        // no other items are present
        emit failure(QString::fromUtf8(dict.value("failure reason").toByteArray()));
        return;
    }

    if (dict.contains("warning message")) {
        // continue processing
        emit warning(QString::fromUtf8(dict.value("warning message").toByteArray()));
    }

    if (dict.contains("tracker id")) {
        // store it
        trackerId = dict.value("tracker id").toByteArray();
    }

    if (dict.contains("interval")) {
        // Mandatory item
        if (requestIntervalTimer != -1)
            killTimer(requestIntervalTimer);
        requestIntervalTimer = startTimer(dict.value("interval").toInt() * 1000);
    }

    if (dict.contains("peers")) {
        // store it
        peers.clear();
        QVariant peerEntry = dict.value("peers");
        if (peerEntry.type() == QVariant::List) {
            QList<QVariant> peerTmp = peerEntry.toList();
            for (int i = 0; i < peerTmp.size(); ++i) {
                TorrentPeer tmp;
                QMap<QByteArray, QVariant> peer = qVariantValue<QMap<QByteArray, QVariant> >(peerTmp.at(i));
                tmp.id = QString::fromUtf8(peer.value("peer id").toByteArray());
                tmp.address.setAddress(QString::fromUtf8(peer.value("ip").toByteArray()));
                tmp.port = peer.value("port").toInt();
                peers << tmp;
            }
        } else {
            QByteArray peerTmp = peerEntry.toByteArray();
            for (int i = 0; i < peerTmp.size(); i += 6) {
                TorrentPeer tmp;
                uchar *data = (uchar *)peerTmp.constData() + i;
                tmp.port = (int(data[4]) << 8) + data[5];
                uint ipAddress = 0;
                ipAddress += uint(data[0]) << 24;
                ipAddress += uint(data[1]) << 16;
                ipAddress += uint(data[2]) << 8;
                ipAddress += uint(data[3]);
                tmp.address.setAddress(ipAddress);
                peers << tmp;
            }
        }
        emit peerListUpdated(peers);
    }
}