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.