23 #include "ip2cparser.h" 25 #include "datastreamoperatorwrapper.h" 31 #include <QMutexLocker> 34 IP2CParser::IP2CParser(
IP2C* pTargetDatabase)
36 currentParsingThread = NULL;
41 bool IP2CParser::doReadDatabase(
const QString& filePath)
43 QMutexLocker mutexLocker(&thisLock);
46 ConstructorDestructorParserStateSetter stateSetter(
this);
48 QFile dataBase(filePath);
49 gLog << tr(
"Parsing IP2C database: %1").arg(dataBase.fileName());
51 if (!dataBase.exists()
52 || !dataBase.open(QIODevice::ReadOnly)
53 || !dataBase.isReadable())
55 gLog << tr(
"Unable to open IP2C file.");
62 QByteArray dataArray = dataBase.readAll();
66 if (pos >= dataArray.size())
71 const char* data = dataArray.constData();
72 unsigned short version = READINT16(&data[pos]);
74 bool wasReadSuccessful =
false;
78 wasReadSuccessful = readDatabaseVersion2(dataArray);
82 wasReadSuccessful =
false;
86 if (!wasReadSuccessful)
91 gLog << tr(
"IP2C database read in %1 ms. Entries read: %2").arg(time.elapsed()).arg(
pTargetDatabase->numKnownEntries());
95 void IP2CParser::parsingThreadFinished()
97 bool bSuccessState = currentParsingThread->bSuccessState;
98 gLog << tr(
"IP2C parsing thread has finished.");
100 delete currentParsingThread;
101 currentParsingThread = NULL;
106 bool IP2CParser::readDatabase(
const QString& filePath)
108 bool bSuccess = doReadDatabase(filePath);
114 void IP2CParser::readDatabaseThreaded(
const QString& filePath)
116 if (currentParsingThread != NULL)
121 ParsingThread* pParsingThread =
new ParsingThread(
this, filePath);
122 connect(pParsingThread, SIGNAL( finished() ),
this, SLOT( parsingThreadFinished() ) );
124 currentParsingThread = pParsingThread;
126 pParsingThread->start();
129 bool IP2CParser::readDatabaseVersion2(
const QByteArray& dataArray)
132 buffer.setData(dataArray);
133 buffer.open(QIODevice::ReadOnly);
134 QDataStream dstream(&buffer);
135 dstream.setByteOrder(QDataStream::LittleEndian);
137 stream.skipRawData(6);
142 QMap<unsigned, IP2C::IP2CData> hashTable;
144 while (stream.hasRemaining())
149 baseEntry.countryFullName = QString::fromUtf8(stream.readRawUntilByte(
'\0'));
150 baseEntry.country = QString::fromUtf8(stream.readRawUntilByte(
'\0'));
151 if (!stream.hasRemaining())
return false;
153 quint32 numOfIpBlocks = stream.readQUInt32();
155 for (quint32 x = 0; x < numOfIpBlocks; ++x)
160 entry.ipStart = stream.readQUInt32();
161 if (!stream.hasRemaining())
return false;
162 entry.ipEnd = stream.readQUInt32();
164 hashTable[entry.ipStart] = entry;
175 IP2CParser::ConstructorDestructorParserStateSetter::ConstructorDestructorParserStateSetter(
IP2CParser* pParser)
177 this->pParser = pParser;
178 pParser->bIsParsing =
true;
181 IP2CParser::ConstructorDestructorParserStateSetter::~ConstructorDestructorParserStateSetter()
183 pParser->bIsParsing =
false;
188 void IP2CParser::ParsingThread::run()
190 bSuccessState = pParser->doReadDatabase(filePath);
void setDatabase(const QList< IP2CData > &sortedCountryData)
Sets database contents to the list specified.
Wraps around QDataStream stream operators to provide cleaner reading interface.
IP2C * pTargetDatabase
Database to which the IP2C parser will save the data it retrieves from IP2C file. ...
IP to Country database handler.
void parsingFinished(bool bSuccess)
A signal emitted when parser finishes its job.