diff --git a/retroshare-gui/src/gui/Posted/PostedItem.h b/retroshare-gui/src/gui/Posted/PostedItem.h index 94bb12ed7..7bb920a6c 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.h +++ b/retroshare-gui/src/gui/Posted/PostedItem.h @@ -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); diff --git a/retroshare-gui/src/gui/common/RSFeedWidget.cpp b/retroshare-gui/src/gui/common/RSFeedWidget.cpp index de18e49e0..be8c1215d 100644 --- a/retroshare-gui/src/gui/common/RSFeedWidget.cpp +++ b/retroshare-gui/src/gui/common/RSFeedWidget.cpp @@ -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 QMapsetData(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 list = ui->treeWidget->findItems(QString::fromStdString(identifier),Qt::MatchExactly,COLUMN_IDENTIFIER); + QList 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; diff --git a/retroshare-gui/src/gui/common/RSFeedWidget.h b/retroshare-gui/src/gui/common/RSFeedWidget.h index 147c95595..bc38adf84 100644 --- a/retroshare-gui/src/gui/common/RSFeedWidget.h +++ b/retroshare-gui/src/gui/common/RSFeedWidget.h @@ -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 &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); diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.h b/retroshare-gui/src/gui/feeds/ChatMsgItem.h index 6dad0d215..fe946a4b9 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.h @@ -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*/) {} diff --git a/retroshare-gui/src/gui/feeds/FeedItem.cpp b/retroshare-gui/src/gui/feeds/FeedItem.cpp index 19cfdbf72..955298a24 100644 --- a/retroshare-gui/src/gui/feeds/FeedItem.cpp +++ b/retroshare-gui/src/gui/feeds/FeedItem.cpp @@ -18,10 +18,11 @@ * * *******************************************************************************/ +#include #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> 3)) + s[i]*0x217898fbba7 + 0x0294379); + + std::cerr << "Producing hash " << std::hex << mHash << std::dec << " from string \"" << s << "\"" << std::endl; + } + + return mHash; +} diff --git a/retroshare-gui/src/gui/feeds/FeedItem.h b/retroshare-gui/src/gui/feeds/FeedItem.h index d377fb027..7cd6808a1 100644 --- a/retroshare-gui/src/gui/feeds/FeedItem.h +++ b/retroshare-gui/src/gui/feeds/FeedItem.h @@ -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 diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h index 5c51b396a..1a0c56a70 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.h @@ -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); diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index d7a807d59..cdb4eeaf2 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -71,6 +71,7 @@ void GxsChannelPostItem::init(const RsGxsMessageId& messageId,const std::set