void HeadlessApplication::parseMessageListing(bool read, const QString &threadListing) {
    PrivateMessageListItem *item = new PrivateMessageListItem();

    QRegExp andAmp("&");
    QRegExp quote(""");
    QRegExp euro("€");
    QRegExp inf("<");
    QRegExp sup(">");
    QRegExp nbsp(" ");

    QString SubjectNumber;

    item->setRead(read);

    //qDebug() << threadListing;

    QRegExp addresseeRegexp("<td class=\"sujetCase6 cBackCouleurTab[0-9] \"><a rel=\"nofollow\" href=\"[^\"]+pseudo=([^\"]+)\" class=\"Tableau\">([^\"]+)</a></td>");
    addresseeRegexp.setCaseSensitivity(Qt::CaseSensitive);
    //addresseeRegexp.setMinimal(true);

    if(addresseeRegexp.indexIn(threadListing, 0) != -1) {
        item->setAddressee(addresseeRegexp.cap(1));
        //qDebug() << addresseeRegexp.cap(1) << addresseeRegexp.cap(2) << addresseeRegexp.cap(0) ;
    } else {
        item->deleteLater();
        return;
    }

    QRegExp addresseeRead("<span class=\"red\" title");
    addresseeRead.setCaseSensitivity(Qt::CaseSensitive);
    addresseeRead.setMinimal(true);


    if(addresseeRead.indexIn(threadListing, 0) != -1)
        item->setAddresseeRead(false);
    else
        item->setAddresseeRead(true);


    QRegExp mpTitle("class=\"sujetCase3\".*<a href=\"(.+)\" class=\"cCatTopic\" title=\"Sujet n.([0-9]+)\">(.+)</a></td><td class=\"sujetCase4\">");
    mpTitle.setCaseSensitivity(Qt::CaseSensitive);
    mpTitle.setMinimal(true);


    if(mpTitle.indexIn(threadListing, 0) != -1) {
        QString s = mpTitle.cap(3);
        SubjectNumber = mpTitle.cap(2);
        s.replace(andAmp, "&");
        s.replace(quote,"\"");
        s.replace(euro, "e");
        s.replace(inf, "<");
        s.replace(sup, ">");

        item->setTitle(s);

        s = mpTitle.cap(1);
        s.replace(andAmp, "&");
        item->setUrlFirstPage(s);
    }


    QRegExp lastPostInfo("<td class=\"sujetCase9 cBackCouleurTab[0-9] \"><a href=\"(.+)\" class=\"Tableau\">(.+)<br /><b>(.+)</b></a></td><td class=\"sujetCase10\">");
    lastPostInfo.setCaseSensitivity(Qt::CaseSensitive);
    lastPostInfo.setMinimal(true);

    if(lastPostInfo.indexIn(threadListing, 0) != -1) {
        QString s = lastPostInfo.cap(1);
        s.replace(andAmp, "&");
        item->setUrlLastPage(s);

        s = lastPostInfo.cap(2);
        s.replace(nbsp, " ");
        item->setTimestamp(s);

        item->setLastAuthor(lastPostInfo.cap(3));
    }

    qint64 timestamp = QDateTime::fromString(item->getTimestamp().mid(0,10) + " " + item->getTimestamp().mid(13), "dd-MM-yyyy hh:mm").toMSecsSinceEpoch();

    // -----------------------------------------------------
    // items already into the hub
    QVariantList hubItems = m_Hub->items();
    QVariantMap itemMap;

    bool existing = false;
    for(int i = 0 ; i < hubItems.length() ; ++i) {
        itemMap = hubItems.at(i).toMap();

        if(itemMap["syncId"].toString() == SubjectNumber) {
            existing = true;
            break;
        }
    }



    qDebug() << "Current item: " << SubjectNumber << " existing: " << existing << " id: src:" << itemMap["sourceId"].toLongLong() << " msg: " << itemMap["messageid"].toString();

    if(existing) {

        qDebug() << "Current item time: " << itemMap["timestamp"].toULongLong() << " new time: " << timestamp;
        if(itemMap["timestamp"].toULongLong() == timestamp) {
            item->deleteLater();
            return;
        }

        qDebug() << "update item. isAddresseeRead: " << item->isAddresseeRead() << " isRead: "  << item->isRead();

        itemMap["description"] = item->getTitle();
        itemMap["timestamp"] = timestamp;
        itemMap["readCount"] = item->isRead();
        itemMap["url"] = item->getUrlLastPage();

        qint64 itemId;
        if (itemMap["sourceId"].toString().length() > 0) {
            itemId = itemMap["sourceId"].toLongLong();
        } else if (itemMap["messageid"].toString().length() > 0) {
            itemId = itemMap["messageid"].toLongLong();
        }

        if(item->isRead()) {
            itemMap["readCount"] = 0;
        }

        qDebug() << "item id: " << itemId;

        m_Hub->updateHubItem(m_Hub->categoryId(), itemId, itemMap, item->isRead());

        if(!item->isRead()) {
            qDebug() << "updated mark item as read.";
            m_Hub->markHubItemRead(m_Hub->categoryId(), itemId);
        }

    } else {

        qDebug() << "new item!";
        QVariantMap entry;
        if(!item->getUrlLastPage().isEmpty())
            entry["url"] = item->getUrlLastPage();
        else {
            if(!item->getUrlFirstPage().isEmpty())
                entry["url"] = item->getUrlFirstPage();
            else {
                item->deleteLater();
                return;
            }
        }

        qDebug() << "insert item into hub";
        m_Hub->addHubItem(m_Hub->categoryId(), entry, item->getAddressee(), item->getTitle(), timestamp, SubjectNumber, SubjectNumber, "",  item->isRead());

        qint64 itemId;
        if (entry["sourceId"].toString().length() > 0) {
            itemId = entry["sourceId"].toLongLong();
        } else if (entry["messageid"].toString().length() > 0) {
            itemId = entry["messageid"].toLongLong();
        }

        qDebug() << "new item id: " << itemId;
        if(!item->isRead()) {
            qDebug() << "mark new item as already read.";
            m_Hub->markHubItemRead(m_Hub->categoryId(), itemId);
        }
    }

    item->deleteLater();


}
void PrivateMessageController::parseMessageListing(bool read, const QString &threadListing) {
	PrivateMessageListItem *item = new PrivateMessageListItem();

	QRegExp andAmp("&amp;");
	QRegExp quote("&#034;");
	QRegExp euro("&euro;");
	QRegExp inf("&lt;");
	QRegExp sup("&gt;");
	QRegExp nbsp("&nbsp;");

	item->setRead(read);

	QRegExp addresseeRegexp("<td class=\"sujetCase6 cBackCouleurTab[0-9] \"><a rel=\"nofollow\" href=\"[^\"]+pseudo=([^\"]+)\"");
	addresseeRegexp.setCaseSensitivity(Qt::CaseSensitive);
	addresseeRegexp.setMinimal(true);

	if(addresseeRegexp.indexIn(threadListing, 0) != -1) {
		item->setAddressee(addresseeRegexp.cap(1));
	} else {
		item->deleteLater();
		return;
	}

	QRegExp addresseeRead("<span class=\"red\" title");
	addresseeRead.setCaseSensitivity(Qt::CaseSensitive);
	addresseeRead.setMinimal(true);


	if(addresseeRead.indexIn(threadListing, 0) != -1)
		item->setAddresseeRead(false);
	else
		item->setAddresseeRead(true);


	QRegExp mpTitle("class=\"sujetCase3\".*<a href=\"(.+)\" class=\"cCatTopic\" title=\"Sujet n.[0-9]+\">(.+)</a></td><td class=\"sujetCase4\">");
	mpTitle.setCaseSensitivity(Qt::CaseSensitive);
	mpTitle.setMinimal(true);


	if(mpTitle.indexIn(threadListing, 0) != -1) {
		QString s = mpTitle.cap(2);
		s.replace(andAmp, "&");
		s.replace(quote,"\"");
		s.replace(euro, "e");
		s.replace(inf, "<");
		s.replace(sup, ">");

		item->setTitle(s);

		s = mpTitle.cap(1);
		s.replace(andAmp, "&");
		item->setUrlFirstPage(s);
	}


	QRegExp lastPostInfo("<td class=\"sujetCase9 cBackCouleurTab[0-9] \"><a href=\"(.+)\" class=\"Tableau\">(.+)<br /><b>(.+)</b></a></td><td class=\"sujetCase10\">");
	lastPostInfo.setCaseSensitivity(Qt::CaseSensitive);
	lastPostInfo.setMinimal(true);

	if(lastPostInfo.indexIn(threadListing, 0) != -1) {
		QString s = lastPostInfo.cap(1);
		s.replace(andAmp, "&");
		item->setUrlLastPage(s);

		s = lastPostInfo.cap(2);
		s.replace(nbsp, " ");
		item->setTimestamp(s);

		item->setLastAuthor(lastPostInfo.cap(3));
	}

	m_Datas->append(item);

}