mirror of
https://github.com/MultiMC/MultiMC5.git
synced 2024-11-20 17:11:57 +00:00
99 lines
1.7 KiB
C++
99 lines
1.7 KiB
C++
#include "URNResolver.h"
|
|
#include <logger/QsLog.h>
|
|
#include "MultiMC.h"
|
|
#include "logic/forge/ForgeVersionList.h"
|
|
#include "logic/forge/ForgeVersion.h"
|
|
|
|
QString unescapeNSS(QString RawNSS)
|
|
{
|
|
QString NSS;
|
|
NSS.reserve(RawNSS.size());
|
|
enum
|
|
{
|
|
Normal,
|
|
FirstHex,
|
|
SecondHex
|
|
} ParseState = Normal;
|
|
|
|
QByteArray translator(" ");
|
|
|
|
for (auto ch : RawNSS)
|
|
{
|
|
if(ParseState == Normal)
|
|
{
|
|
if(ch == '%')
|
|
{
|
|
ParseState = FirstHex;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
NSS.append(ch);
|
|
}
|
|
}
|
|
if(ParseState == FirstHex)
|
|
{
|
|
translator[0] = ch.toLower().unicode();
|
|
ParseState = SecondHex;
|
|
}
|
|
else if(ParseState == SecondHex)
|
|
{
|
|
translator[1] = ch.toLower().unicode();
|
|
auto result = QByteArray::fromHex(translator);
|
|
if (result[0] == '\0')
|
|
return NSS;
|
|
NSS.append(result);
|
|
ParseState = Normal;
|
|
}
|
|
}
|
|
return NSS;
|
|
}
|
|
|
|
bool URNResolver::parse(const QString &URN, QString &NID, QString &NSS)
|
|
{
|
|
QRegExp URNPattern(
|
|
"^urn:([a-z0-9][a-z0-9-]{0,31}):(([a-z0-9()+,\\-.:=@;$_!*']|%[0-9a-f]{2})+).*",
|
|
Qt::CaseInsensitive);
|
|
if (URNPattern.indexIn(URN) == -1)
|
|
return false;
|
|
auto captures = URNPattern.capturedTexts();
|
|
QString RawNID = captures[1];
|
|
QString RawNSS = captures[2];
|
|
|
|
NID = RawNID.toLower();
|
|
NSS = unescapeNSS(RawNSS);
|
|
return true;
|
|
}
|
|
|
|
URNResolver::URNResolver()
|
|
{
|
|
}
|
|
|
|
QVariant URNResolver::resolve(QString URN)
|
|
{
|
|
QString NID, NSS;
|
|
parse(URN, NID, NSS);
|
|
|
|
if(NID != "x-mmc")
|
|
return QVariant();
|
|
auto parts = NSS.split(":");
|
|
if(parts.size() < 1)
|
|
return QVariant();
|
|
unsigned int version = parts[0].toUInt();
|
|
switch(version)
|
|
{
|
|
case 1:
|
|
return resolveV1(parts.mid(1));
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* TODO: implement.
|
|
*/
|
|
QVariant URNResolver::resolveV1(QStringList parts)
|
|
{
|
|
return QVariant();
|
|
}
|