23 #include "ip2cparser.h"
25 #include "datastreamoperatorwrapper.h"
29 #include <QElapsedTimer>
32 #include <QMutexLocker>
34 IP2CParser::IP2CParser()
36 currentParsingThread =
nullptr;
40 bool IP2CParser::doReadDatabase(
const QString &filePath)
42 QMutexLocker mutexLocker(&thisLock);
45 ConstructorDestructorParserStateSetter stateSetter(
this);
47 QFile dataBase(filePath);
48 gLog << tr(
"Parsing IP2C database: %1").arg(dataBase.fileName());
50 if (!dataBase.exists()
51 || !dataBase.open(QIODevice::ReadOnly)
52 || !dataBase.isReadable())
54 gLog << tr(
"Unable to open IP2C file.");
61 QByteArray dataArray = dataBase.readAll();
65 if (pos >= dataArray.size())
68 const char *data = dataArray.constData();
69 unsigned short version = READINT16(&data[pos]);
71 bool wasReadSuccessful =
false;
75 wasReadSuccessful = readDatabaseVersion2(dataArray);
79 wasReadSuccessful =
false;
83 if (!wasReadSuccessful)
86 gLog << tr(
"IP2C database read in %1 ms. Entries read: %2").arg(time.elapsed()).arg(parsedValues.size());
90 void IP2CParser::parsingThreadFinished()
92 bool bSuccessState = currentParsingThread->bSuccessState;
93 gLog << tr(
"IP2C parsing thread has finished.");
95 delete currentParsingThread;
96 currentParsingThread =
nullptr;
101 bool IP2CParser::readDatabase(
const QString &filePath)
103 bool bSuccess = doReadDatabase(filePath);
109 void IP2CParser::readDatabaseThreaded(
const QString &filePath)
111 if (currentParsingThread !=
nullptr)
114 auto pParsingThread =
new ParsingThread(
this, filePath);
115 connect(pParsingThread, SIGNAL(finished()),
this, SLOT(parsingThreadFinished()));
117 currentParsingThread = pParsingThread;
119 pParsingThread->start();
122 bool IP2CParser::readDatabaseVersion2(
const QByteArray &dataArray)
125 buffer.setData(dataArray);
126 buffer.open(QIODevice::ReadOnly);
127 QDataStream dstream(&buffer);
128 dstream.setByteOrder(QDataStream::LittleEndian);
130 stream.skipRawData(6);
135 QMap<unsigned, IP2C::IP2CData> hashTable;
137 while (stream.hasRemaining())
142 baseEntry.countryFullName = QString::fromUtf8(stream.readRawUntilByte(
'\0'));
143 baseEntry.country = QString::fromUtf8(stream.readRawUntilByte(
'\0'));
144 if (!stream.hasRemaining())
147 quint32 numOfIpBlocks = stream.readQUInt32();
149 for (quint32 x = 0; x < numOfIpBlocks; ++x)
154 entry.ipStart = stream.readQUInt32();
155 if (!stream.hasRemaining())
157 entry.ipEnd = stream.readQUInt32();
159 hashTable[entry.ipStart] = entry;
163 this->parsedValues = hashTable.values();
170 IP2CParser::ConstructorDestructorParserStateSetter::ConstructorDestructorParserStateSetter(
IP2CParser *pParser)
172 this->pParser = pParser;
173 pParser->bIsParsing =
true;
176 IP2CParser::ConstructorDestructorParserStateSetter::~ConstructorDestructorParserStateSetter()
178 pParser->bIsParsing =
false;
183 void IP2CParser::ParsingThread::run()
185 bSuccessState = pParser->doReadDatabase(filePath);