⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bencodeparser.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "bencodeparser.h"#include <QList>#include <QMetaType>BencodeParser::BencodeParser(){}bool BencodeParser::parse(const QByteArray &content){    if (content.isEmpty()) {        errString = QString("No content");        return false;    }    this->content = content;    index = 0;    infoStart = 0;    infoLength = 0;    return getDictionary(&dictionaryValue);}QString BencodeParser::errorString() const{    return errString;}QMap<QByteArray, QVariant> BencodeParser::dictionary() const{    return dictionaryValue;}QByteArray BencodeParser::infoSection() const{    return content.mid(infoStart, infoLength);}bool BencodeParser::getByteString(QByteArray *byteString){    const int contentSize = content.size();    int size = -1;    do {	char c = content.at(index);	if (c < '0' || c > '9') {	    if (size == -1)		return false;	    if (c != ':') {		errString = QString("Unexpected character at pos %1: %2")		    .arg(index).arg(c);		return false;	    }	    ++index;	    break;	}	if (size == -1)	    size = 0;	size *= 10;	size += c - '0';    } while (++index < contentSize);    if (byteString)	*byteString = content.mid(index, size);    index += size;    return true;}bool BencodeParser::getInteger(qint64 *integer){    const int contentSize = content.size();    if (content.at(index) != 'i')	return false;    ++index;    qint64 num = -1;    bool negative = false;    do {	char c = content.at(index);	if (c < '0' || c > '9') {	    if (num == -1) {		if (c != '-' || negative)		    return false;		negative = true;		continue;	    } else {		if (c != 'e') {		    errString = QString("Unexpected character at pos %1: %2")			.arg(index).arg(c);		    return false;		}		++index;		break;	    }	}	if (num == -1)	    num = 0;	num *= 10;	num += c - '0';    } while (++index < contentSize);    if (integer)	*integer = negative ? -num : num;    return true;}bool BencodeParser::getList(QList<QVariant> *list){    const int contentSize = content.size();    if (content.at(index) != 'l')	return false;    QList<QVariant> tmp;        ++index;    do {	if (content.at(index) == 'e') {	    ++index;	    break;	}	qint64 number;	QByteArray byteString;	QList<QVariant> tmpList;	QMap<QByteArray, QVariant> dictionary;	if (getInteger(&number))	    tmp << number;	else if (getByteString(&byteString))	    tmp << byteString;	else if (getList(&tmpList))	    tmp << tmpList;	else if (getDictionary(&dictionary))	    tmp << qVariantFromValue<QMap<QByteArray, QVariant> >(dictionary);	else {	    errString = QString("error at index %1").arg(index);	    return false;	}    } while (index < contentSize);    if (list)	*list = tmp;    return true;}bool BencodeParser::getDictionary(QMap<QByteArray, QVariant> *dictionary){    const int contentSize = content.size();    if (content.at(index) != 'd')	return false;    QMap<QByteArray, QVariant> tmp;        ++index;    do {	if (content.at(index) == 'e') {	    ++index;	    break;	}	QByteArray key;	if (!getByteString(&key))	    break;	if (key == "info")	  infoStart = index;	qint64 number;	QByteArray byteString;	QList<QVariant> tmpList;	QMap<QByteArray, QVariant> dictionary;	if (getInteger(&number))	    tmp.insert(key, number);	else if (getByteString(&byteString))	    tmp.insert(key, byteString);	else if (getList(&tmpList))	    tmp.insert(key, tmpList);	else if (getDictionary(&dictionary))	    tmp.insert(key, qVariantFromValue<QMap<QByteArray, QVariant> >(dictionary));	else {	    errString = QString("error at index %1").arg(index);	    return false;	}	if (key == "info")	  infoLength = index - infoStart;    } while (index < contentSize);    if (dictionary)	*dictionary = tmp;    return true;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -