mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-25 17:21:27 -05:00
fixed feed bug by moving away from std::string as a return type to uniqueIdentifier(). Now uint64_ hash is used and cached
This commit is contained in:
parent
ff86d3cd20
commit
137cb5271d
@ -49,7 +49,7 @@ public:
|
||||
const RsPostedPost &getPost() const;
|
||||
RsPostedPost &post();
|
||||
|
||||
std::string uniqueIdentifier() const override { return "PostedItem " + mMessageId.toStdString(); }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("PostedItem " + mMessageId.toStdString()); }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
|
@ -179,7 +179,7 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, Qt::ItemDataRole sortRole, co
|
||||
QTreeWidgetItem *treeItem = new RSTreeWidgetItem(mFeedCompareRole);
|
||||
|
||||
treeItem->setData(COLUMN_FEED, sortRole, value);
|
||||
treeItem->setData(COLUMN_IDENTIFIER, Qt::DisplayRole, QString::fromStdString(feedItem->uniqueIdentifier()));
|
||||
treeItem->setData(COLUMN_IDENTIFIER, Qt::DisplayRole, QString("%1").arg(feedItem->uniqueIdentifier(),8,16,QChar('0')));
|
||||
|
||||
ui->treeWidget->addTopLevelItem(treeItem);
|
||||
ui->treeWidget->setItemWidget(treeItem, 0, feedItem);
|
||||
@ -207,9 +207,9 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole,
|
||||
for (it = sort.begin(); it != sort.end(); ++it) {
|
||||
treeItem->setData(COLUMN_FEED, it.key(), it.value());
|
||||
}
|
||||
treeItem->setData(COLUMN_IDENTIFIER, Qt::DisplayRole, QString("%1").arg(feedItem->uniqueIdentifier(),8,16,QChar('0')));
|
||||
|
||||
ui->treeWidget->addTopLevelItem(treeItem);
|
||||
treeItem->setData(COLUMN_FEED, Qt::DisplayRole, QString::fromStdString(feedItem->uniqueIdentifier()));
|
||||
ui->treeWidget->setItemWidget(treeItem, 0, feedItem);
|
||||
|
||||
feedAdded(feedItem, treeItem);
|
||||
@ -438,10 +438,10 @@ void RSFeedWidget::feedItemDestroyed(FeedItem *feedItem)
|
||||
emit feedCountChanged();
|
||||
}
|
||||
|
||||
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(const std::string& identifier)
|
||||
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(uint64_t identifier)
|
||||
{
|
||||
std::cerr << "FindTreeWidgetItem: looking for \"" << identifier << "\"" << std::endl;
|
||||
QList<QTreeWidgetItem*> list = ui->treeWidget->findItems(QString::fromStdString(identifier),Qt::MatchExactly,COLUMN_IDENTIFIER);
|
||||
QList<QTreeWidgetItem*> list = ui->treeWidget->findItems(QString("%1").arg(identifier,8,16,QChar('0')),Qt::MatchExactly,COLUMN_IDENTIFIER);
|
||||
|
||||
if(list.empty())
|
||||
{
|
||||
@ -495,7 +495,7 @@ void RSFeedWidget::withAll(RSFeedWidgetCallbackFunction callback, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
FeedItem *RSFeedWidget::findFeedItem(const std::string& identifier)
|
||||
FeedItem *RSFeedWidget::findFeedItem(uint64_t identifier)
|
||||
{
|
||||
QTreeWidgetItemIterator it(ui->treeWidget);
|
||||
QTreeWidgetItem *treeItem=NULL;
|
||||
@ -515,7 +515,7 @@ FeedItem *RSFeedWidget::findFeedItem(const std::string& identifier)
|
||||
// if(feedItem->uniqueIdentifier() == identifier)
|
||||
// causes a crash. I dont know why! If someone ever finds why, please tell me.
|
||||
|
||||
std::string id = feedItem->uniqueIdentifier();
|
||||
uint64_t id = feedItem->uniqueIdentifier();
|
||||
|
||||
std::cerr << "Comparing \"" << id << "\"";
|
||||
std::cerr << " to " << identifier << "\"" << " pthread_t = " << pthread_self() << std::endl;
|
||||
|
@ -71,7 +71,7 @@ public:
|
||||
bool scrollTo(FeedItem *feedItem, bool focus);
|
||||
|
||||
void withAll(RSFeedWidgetCallbackFunction callback, void *data);
|
||||
FeedItem *findFeedItem(const std::string &identifier);
|
||||
FeedItem *findFeedItem(uint64_t identifier);
|
||||
|
||||
void selectedFeedItems(QList<FeedItem*> &feedItems);
|
||||
|
||||
@ -98,7 +98,7 @@ private:
|
||||
void connectSignals(FeedItem *feedItem);
|
||||
void disconnectSignals(FeedItem *feedItem);
|
||||
FeedItem *feedItemFromTreeItem(QTreeWidgetItem *treeItem);
|
||||
QTreeWidgetItem *findTreeWidgetItem(const std::string &identifier);
|
||||
QTreeWidgetItem *findTreeWidgetItem(uint64_t identifier);
|
||||
void filterItems();
|
||||
void filterItem(QTreeWidgetItem *treeItem, FeedItem *feedItem);
|
||||
|
||||
|
@ -37,7 +37,7 @@ public:
|
||||
|
||||
void updateItemStatic();
|
||||
|
||||
virtual std::string uniqueIdentifier() const override { return "ChatMsgItem " + mPeerId.toStdString(); }
|
||||
virtual uint64_t uniqueIdentifier() const override { return hash_64bits("ChatMsgItem " + mPeerId.toStdString()); }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool /*open*/) {}
|
||||
|
@ -18,10 +18,11 @@
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
#include <iostream>
|
||||
#include "FeedItem.h"
|
||||
|
||||
/** Constructor */
|
||||
FeedItem::FeedItem(QWidget *parent) : QWidget(parent)
|
||||
FeedItem::FeedItem(QWidget *parent) : QWidget(parent), mHash(0)
|
||||
{
|
||||
mWasExpanded = false;
|
||||
}
|
||||
@ -43,3 +44,18 @@ void FeedItem::expand(bool open)
|
||||
mWasExpanded = true;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t FeedItem::hash_64bits(const std::string& s) const
|
||||
{
|
||||
if(mHash == 0)
|
||||
{
|
||||
mHash = 0x01110bbfa09;
|
||||
|
||||
for(uint32_t i=0;i<s.size();++i)
|
||||
mHash = ~(((mHash << 31) ^ (mHash >> 3)) + s[i]*0x217898fbba7 + 0x0294379);
|
||||
|
||||
std::cerr << "Producing hash " << std::hex << mHash << std::dec << " from string \"" << s << "\"" << std::endl;
|
||||
}
|
||||
|
||||
return mHash;
|
||||
}
|
||||
|
@ -41,17 +41,19 @@ public:
|
||||
* \return returns a string that is unique to this specific item. The string will be used to search for an existing item that
|
||||
* would contain the same information. It should therefore sumarise the data represented by the item.
|
||||
*/
|
||||
virtual std::string uniqueIdentifier() const =0;
|
||||
virtual uint64_t uniqueIdentifier() const =0;
|
||||
protected:
|
||||
virtual void doExpand(bool open) = 0;
|
||||
virtual void expandFill(bool /*first*/) {}
|
||||
|
||||
uint64_t hash_64bits(const std::string& s) const;
|
||||
signals:
|
||||
void sizeChanged(FeedItem *feedItem);
|
||||
void feedItemDestroyed(FeedItem *feedItem);
|
||||
|
||||
private:
|
||||
bool mWasExpanded;
|
||||
mutable uint64_t mHash;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -41,8 +41,7 @@ public:
|
||||
~GxsChannelGroupItem();
|
||||
|
||||
bool setGroup(const RsGxsChannelGroup &group);
|
||||
|
||||
std::string uniqueIdentifier() const override { return "GxsChannelGroupItem " + mGroup.mMeta.mGroupId.toStdString() ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("GxsChannelGroupItem " + groupId().toStdString()) ; }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
|
@ -71,6 +71,7 @@ void GxsChannelPostItem::init(const RsGxsMessageId& messageId,const std::set<RsG
|
||||
|
||||
setup();
|
||||
|
||||
mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded
|
||||
mLoaded = false ;
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,7 @@ public:
|
||||
//GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelPost &post, bool isHome, bool autoUpdate);
|
||||
virtual ~GxsChannelPostItem();
|
||||
|
||||
virtual std::string uniqueIdentifier() const override { "GxsChannelPostItem " + mPost.mMeta.mMsgId.toStdString() ; }
|
||||
uint64_t uniqueIdentifier() const override { hash_64bits("GxsChannelPostItem " + mPost.mMeta.mMsgId.toStdString()) ; }
|
||||
|
||||
bool setGroup(const RsGxsChannelGroup &group, bool doFill = true);
|
||||
bool setPost(const RsGxsChannelPost &post, bool doFill = true);
|
||||
|
@ -167,9 +167,9 @@ void GxsCircleItem::setup()
|
||||
|
||||
}
|
||||
|
||||
std::string GxsCircleItem::uniqueIdentifier() const
|
||||
uint64_t GxsCircleItem::uniqueIdentifier() const
|
||||
{
|
||||
return "GxsCircle " + mCircleId.toStdString() + " " + mGxsId.toStdString() + " " + QString::number(mType).toStdString();
|
||||
return hash_64bits("GxsCircle " + mCircleId.toStdString() + " " + mGxsId.toStdString() + " " + QString::number(mType).toStdString());
|
||||
}
|
||||
|
||||
void GxsCircleItem::removeItem()
|
||||
|
@ -52,7 +52,7 @@ public:
|
||||
GxsCircleItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsCircleId &circleId, const RsGxsId &gxsId, const uint32_t type);
|
||||
virtual ~GxsCircleItem();
|
||||
|
||||
std::string uniqueIdentifier() const override;
|
||||
uint64_t uniqueIdentifier() const override;
|
||||
void loadRequest(const TokenQueue *queue, const TokenRequest &req);
|
||||
|
||||
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
|
||||
bool setGroup(const RsGxsForumGroup &group);
|
||||
|
||||
virtual std::string uniqueIdentifier() const override { return "GxsForumGroupItem " + mGroup.mMeta.mGroupId.toStdString() ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumGroupItem " + groupId().toStdString()) ; }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
|
@ -43,6 +43,8 @@
|
||||
GxsForumMsgItem::GxsForumMsgItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate) :
|
||||
GxsFeedItem(feedHolder, feedId, groupId, messageId, isHome, rsGxsForums, autoUpdate)
|
||||
{
|
||||
mMessage.mMeta.mMsgId = messageId; // useful for uniqueIdentifier() before the post is actually loaded
|
||||
mMessage.mMeta.mGroupId = groupId;
|
||||
setup();
|
||||
|
||||
requestGroup();
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
bool setGroup(const RsGxsForumGroup &group, bool doFill = true);
|
||||
bool setMessage(const RsGxsForumMsg &msg, bool doFill = true);
|
||||
|
||||
std::string uniqueIdentifier() const override { return "GxsForumMsgItem " + mMessage.mMeta.mMsgId.toStdString() ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumMsgItem " + mMessage.mMeta.mMsgId.toStdString()) ; }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
|
@ -38,7 +38,7 @@ public:
|
||||
|
||||
void updateItemStatic();
|
||||
|
||||
virtual std::string uniqueIdentifier() const override { return "MsgItem " + mMsgId ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("MsgItem " + mMsgId) ; }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
|
@ -67,9 +67,9 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId,
|
||||
updateItem();
|
||||
}
|
||||
|
||||
std::string PeerItem::uniqueIdentifier() const
|
||||
uint64_t PeerItem::uniqueIdentifier() const
|
||||
{
|
||||
return "PeerItem " + mPeerId.toStdString() + " " + QString::number(mType).toStdString() ;
|
||||
return hash_64bits("PeerItem " + mPeerId.toStdString() + " " + QString::number(mType).toStdString()) ;
|
||||
}
|
||||
|
||||
void PeerItem::updateItemStatic()
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
|
||||
void updateItemStatic();
|
||||
|
||||
std::string uniqueIdentifier() const override;
|
||||
uint64_t uniqueIdentifier() const override;
|
||||
|
||||
protected:
|
||||
/* FeedItem */
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
|
||||
bool setGroup(const RsPostedGroup &group);
|
||||
|
||||
virtual std::string uniqueIdentifier() const override { return "PostedGroupItem " + mGroup.mMeta.mGroupId.toStdString() ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("PostedGroupItem " + groupId().toStdString()) ; }
|
||||
|
||||
protected:
|
||||
/* FeedItem */
|
||||
|
@ -78,9 +78,9 @@ void SecurityIpItem::setup()
|
||||
updateItem();
|
||||
}
|
||||
|
||||
std::string SecurityIpItem::uniqueIdentifier() const
|
||||
uint64_t SecurityIpItem::uniqueIdentifier() const
|
||||
{
|
||||
return "SecurityItem " + QString::number(mType).toStdString() + " " + mSslId.toStdString() + " " + mIpAddr + " " + mIpAddrReported ;
|
||||
return hash_64bits("SecurityItem " + QString::number(mType).toStdString() + " " + mSslId.toStdString() + " " + mIpAddr + " " + mIpAddrReported) ;
|
||||
}
|
||||
|
||||
void SecurityIpItem::updateItemStatic()
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
|
||||
void updateItemStatic();
|
||||
|
||||
std::string uniqueIdentifier() const override;
|
||||
uint64_t uniqueIdentifier() const override;
|
||||
|
||||
protected:
|
||||
/* FeedItem */
|
||||
|
@ -81,9 +81,9 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &g
|
||||
updateItem();
|
||||
}
|
||||
|
||||
std::string SecurityItem::uniqueIdentifier() const
|
||||
uint64_t SecurityItem::uniqueIdentifier() const
|
||||
{
|
||||
return "SecurityItem " + QString::number(mType).toStdString() + " " + mSslId.toStdString();
|
||||
return hash_64bits("SecurityItem " + QString::number(mType).toStdString() + " " + mSslId.toStdString());
|
||||
}
|
||||
|
||||
void SecurityItem::updateItemStatic()
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
|
||||
void updateItemStatic();
|
||||
|
||||
std::string uniqueIdentifier() const override;
|
||||
uint64_t uniqueIdentifier() const override;
|
||||
|
||||
protected:
|
||||
/* FeedItem */
|
||||
|
Loading…
x
Reference in New Issue
Block a user