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")) {
Beispiel #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")) {