MultiMC5/logic/URNResolver.cpp
2014-06-09 01:38:29 +02:00

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();
}