From a496e6f1b0adc1472565cddf0250973134d08701 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 4 Feb 2018 17:51:26 +0100 Subject: [PATCH] Add Chat Room RSLink --- retroshare-gui/src/gui/ChatLobbyWidget.cpp | 29 +- retroshare-gui/src/gui/ChatLobbyWidget.h | 3 +- .../gui/FileTransfer/SharedFilesDialog.cpp | 2 +- retroshare-gui/src/gui/Identity/IdDialog.cpp | 12 +- retroshare-gui/src/gui/RetroShareLink.cpp | 1576 +++++++++-------- retroshare-gui/src/gui/RetroShareLink.h | 101 +- retroshare-gui/src/gui/chat/ChatDialog.cpp | 16 +- retroshare-gui/src/gui/chat/ChatWidget.cpp | 2 +- retroshare-gui/src/util/HandleRichText.cpp | 6 +- 9 files changed, 986 insertions(+), 761 deletions(-) diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index 8bfb80a98..1ec3d39f0 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -7,6 +7,7 @@ #include "chat/ChatTabWidget.h" #include "chat/CreateLobbyDialog.h" #include "common/RSTreeWidgetItem.h" +#include "gui/RetroShareLink.h" #include "gui/gxs/GxsIdDetails.h" #include "gui/Identity/IdEditDialog.h" #include "gui/settings/rsharesettings.h" @@ -58,6 +59,7 @@ #define IMAGE_TYPING ":images/typing.png" #define IMAGE_MESSAGE ":images/chat.png" #define IMAGE_AUTOSUBSCRIBE ":images/accepted16.png" +#define IMAGE_COPYRSLINK ":/images/copyrslink.png" ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags) : RsAutoUpdatePage(5000, parent, flags) @@ -321,6 +323,8 @@ void ChatLobbyWidget::lobbyTreeWidgetCustomPopupMenu(QPoint) contextMnu.addAction(QIcon(IMAGE_AUTOSUBSCRIBE), tr("Remove Auto Subscribe"), this, SLOT(autoSubscribeItem())); else if(!own_identities.empty()) contextMnu.addAction(QIcon(IMAGE_SUBSCRIBE), tr("Add Auto Subscribe"), this, SLOT(autoSubscribeItem())); + + contextMnu.addAction(QIcon(IMAGE_COPYRSLINK), tr("Copy RetroShare Link"), this, SLOT(copyItemLink())); } contextMnu.addSeparator();//------------------------------------------------------------------- @@ -743,7 +747,7 @@ void ChatLobbyWidget::subscribeChatLobbyAs() ChatDialog::chatFriend(ChatId(id),true) ; } -void ChatLobbyWidget::showLobbyAnchor(ChatLobbyId id, QString anchor) +bool ChatLobbyWidget::showLobbyAnchor(ChatLobbyId id, QString anchor) { QTreeWidgetItem *item = getTreeWidgetItem(id) ; @@ -758,13 +762,14 @@ void ChatLobbyWidget::showLobbyAnchor(ChatLobbyId id, QString anchor) ChatLobbyDialog *cldCW=NULL ; if (NULL != (cldCW = dynamic_cast(ui.stackedWidget->currentWidget()))) cldCW->getChatWidget()->scrollToAnchor(anchor); - - ui.lobbyTreeWidget->setCurrentItem(item); } + ui.lobbyTreeWidget->setCurrentItem(item); + return true; } } + return false; } void ChatLobbyWidget::subscribeChatLobbyAtItem(QTreeWidgetItem *item) @@ -890,6 +895,24 @@ void ChatLobbyWidget::autoSubscribeItem() autoSubscribeLobby(ui.lobbyTreeWidget->currentItem()); } +void ChatLobbyWidget::copyItemLink() +{ + QTreeWidgetItem *item = ui.lobbyTreeWidget->currentItem(); + if (item == NULL || item->type() != TYPE_LOBBY) { + return; + } + + ChatLobbyId id = item->data(COLUMN_DATA, ROLE_ID).toULongLong(); + QString name = item->text(COLUMN_NAME); + + RetroShareLink link = RetroShareLink::createChatRoom(ChatId(id),name); + if (link.valid()) { + QList urls; + urls.push_back(link); + RSLinkClipboard::copyLinks(urls); + } +} + QTreeWidgetItem *ChatLobbyWidget::getTreeWidgetItem(ChatLobbyId id) { for(int p=0;p<4;++p) diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.h b/retroshare-gui/src/gui/ChatLobbyWidget.h index 32b149dfb..cc3c26af3 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.h +++ b/retroshare-gui/src/gui/ChatLobbyWidget.h @@ -50,7 +50,7 @@ public: void setCurrentChatPage(ChatLobbyDialog *) ; // used by ChatLobbyDialog to raise. void addChatPage(ChatLobbyDialog *) ; - void showLobbyAnchor(ChatLobbyId id, QString anchor) ; + bool showLobbyAnchor(ChatLobbyId id, QString anchor) ; uint unreadCount(); @@ -78,6 +78,7 @@ protected slots: void updatePeerEntering(ChatLobbyId); void updatePeerLeaving(ChatLobbyId); void autoSubscribeItem(); + void copyItemLink(); private slots: void filterColumnChanged(int); diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 3c50aa7fa..a8ebf7363 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -603,7 +603,7 @@ void SharedFilesDialog::copyLinks(const QModelIndexList& lst, bool remote,QList< QString dir_name = QDir(QString::fromUtf8(details.name.c_str())).dirName(); - RetroShareLink link = RetroShareLink::createCollection(dir_name,ft->mTotalSize,ft->mTotalFiles,QString::fromStdString(ft->toRadix64())) ; + RetroShareLink link = RetroShareLink::createFileTree(dir_name,ft->mTotalSize,ft->mTotalFiles,QString::fromStdString(ft->toRadix64())) ; if(link.valid()) urls.push_back(link) ; diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 065a7cb66..d901c813d 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -1964,10 +1964,10 @@ QString IdDialog::createUsageString(const RsIdentityUsage& u) const switch(u.mServiceId) { - case RS_SERVICE_GXS_TYPE_CHANNELS: service_name = tr("Channels") ;service_type = RetroShareLink::TYPE_CHANNEL ; break ; - case RS_SERVICE_GXS_TYPE_FORUMS: service_name = tr("Forums") ; service_type = RetroShareLink::TYPE_FORUM ; break ; - case RS_SERVICE_GXS_TYPE_POSTED: service_name = tr("Posted") ; service_type = RetroShareLink::TYPE_POSTED ; break ; - case RS_SERVICE_TYPE_CHAT: service_name = tr("Chat") ; break ; + case RS_SERVICE_GXS_TYPE_CHANNELS: service_name = tr("Channels") ;service_type = RetroShareLink::TYPE_CHANNEL ; break ; + case RS_SERVICE_GXS_TYPE_FORUMS: service_name = tr("Forums") ; service_type = RetroShareLink::TYPE_FORUM ; break ; + case RS_SERVICE_GXS_TYPE_POSTED: service_name = tr("Posted") ; service_type = RetroShareLink::TYPE_POSTED ; break ; + case RS_SERVICE_TYPE_CHAT: service_name = tr("Chat") ; service_type = RetroShareLink::TYPE_CHAT_ROOM ; break ; default: service_name = tr("Unknown"); service_type = RetroShareLink::TYPE_UNKNOWN ; } @@ -1994,8 +1994,8 @@ QString IdDialog::createUsageString(const RsIdentityUsage& u) const } case RsIdentityUsage::CHAT_LOBBY_MSG_VALIDATION: // Chat lobby msgs are signed, so each time one comes, or a chat lobby event comes, a signature verificaiton happens. { - // there is no link for chat lobby yet. - return tr("Message in chat lobby %1").arg(u.mAdditionalId) ; + RetroShareLink l = RetroShareLink::createChatRoom(ChatId(ChatLobbyId(u.mAdditionalId)),QString::number(u.mAdditionalId)); + return tr("Message in chat room %1").arg(l.toHtml()) ; } case RsIdentityUsage::GLOBAL_ROUTER_SIGNATURE_CHECK: // Global router message validation { diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index d6bd38666..266970a54 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -17,70 +17,70 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include -#include -#include -#include +#include "RetroShareLink.h" + +#include "ChatLobbyWidget.h" +#include "MainWindow.h" +#include "chat/ChatDialog.h" +#include "common/PeerDefs.h" +#include "common/RsCollection.h" +#include "common/RsUrlHandler.h" +#include "connect/ConfCertDialog.h" +#include "connect/ConnectFriendWizard.h" +#include "connect/PGPKeyDialog.h" +#include "FileTransfer/SearchDialog.h" +#include "gxschannels/GxsChannelDialog.h" +#include "gxsforums/GxsForumsDialog.h" +#include "msgs/MessageComposer.h" +#include "Posted/PostedDialog.h" +#include "util/misc.h" + +#include +#include +#include +#include +#include +#include + #include -#include #include #include -#include #include +#include +#include #include -#include - +#include +#include #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) #include #endif -#include "RetroShareLink.h" -#include "MainWindow.h" -#include "gui/gxsforums/GxsForumsDialog.h" -#include "gui/gxschannels/GxsChannelDialog.h" -#include "gui/Posted/PostedDialog.h" -#include "gui/FileTransfer/SearchDialog.h" -#include "msgs/MessageComposer.h" -#include "util/misc.h" -#include "common/PeerDefs.h" -#include "common/RsCollection.h" -#include -#include "gui/connect/ConnectFriendWizard.h" -#include "gui/connect/ConfCertDialog.h" -#include "gui/connect/PGPKeyDialog.h" - -#include -#include -#include -#include -#include +#include +#include //#define DEBUG_RSLINK 1 #define HOST_FILE "file" -#define HOST_COLLECTION "collection" -#define HOST_EXTRAFILE "extra" #define HOST_PERSON "person" #define HOST_FORUM "forum" #define HOST_CHANNEL "channel" -#define HOST_POSTED "posted" -#define HOST_MESSAGE "message" #define HOST_SEARCH "search" +#define HOST_MESSAGE "message" #define HOST_CERTIFICATE "certificate" +#define HOST_EXTRAFILE "extra" +//#define HOST_PRIVATE_CHAT"private_chat" #define HOST_PUBLIC_MSG "public_msg" +#define HOST_POSTED "posted" #define HOST_IDENTITY "identity" -#define HOST_REGEXP "file|collection|extra|person|forum|channel|posted|search|message|certificate|private_chat|public_msg|identity" +#define HOST_FILE_TREE "collection" +#define HOST_CHAT_ROOM "chat_room" +#define HOST_REGEXP "file|person|forum|channel|search|message|certificate|extra|private_chat|public_msg|posted|identity|collection|chat_room" #define FILE_NAME "name" #define FILE_SIZE "size" #define FILE_HASH "hash" #define FILE_SOURCE "src" -#define COLLECTION_NAME "name" -#define COLLECTION_SIZE "size" -#define COLLECTION_DATA "radix" -#define COLLECTION_COUNT "files" - #define PERSON_NAME "name" #define PERSON_HASH "hash" @@ -92,19 +92,11 @@ #define CHANNEL_ID "id" #define CHANNEL_MSGID "msgid" -#define POSTED_NAME "name" -#define POSTED_ID "id" -#define POSTED_MSGID "msgid" - -#define IDENTITY_NAME "name" -#define IDENTITY_ID "gxsid" -#define IDENTITY_GROUP "groupdata" +#define SEARCH_KEYWORDS "keywords" #define MESSAGE_ID "id" #define MESSAGE_SUBJECT "subject" -#define SEARCH_KEYWORDS "keywords" - #define CERTIFICATE_SSLID "sslid" #define CERTIFICATE_GPG_ID "gpgid" #define CERTIFICATE_GPG_BASE64 "gpgbase64" @@ -116,9 +108,30 @@ #define CERTIFICATE_DYNDNS "dyndns" #define CERTIFICATE_RADIX "radix" +#define EXTRAFILE_NAME "name" +#define EXTRAFILE_SIZE "size" +#define EXTRAFILE_HASH "hash" +#define EXTRAFILE_SOURCE "src" + #define PUBLIC_MSG_TIME_STAMP "time_stamp" -#define PUBLIC_MSG_SRC_PGP_ID "gpgid" #define PUBLIC_MSG_HASH "hash" +#define PUBLIC_MSG_SRC_PGP_ID "gpgid" + +#define POSTED_NAME "name" +#define POSTED_ID "id" +#define POSTED_MSGID "msgid" + +#define IDENTITY_ID "gxsid" +#define IDENTITY_NAME "name" +#define IDENTITY_GROUP "groupdata" + +#define FILE_TREE_NAME "name" +#define FILE_TREE_SIZE "size" +#define FILE_TREE_DATA "radix" +#define FILE_TREE_COUNT "files" + +#define CHAT_ROOM_NAME "name" +#define CHAT_ROOM_ID "id" RetroShareLink::RetroShareLink(const QUrl& url) { @@ -140,7 +153,7 @@ void RetroShareLink::fromString(const QString& url) #endif if ((url.startsWith(QString(RSLINK_SCHEME) + "://" + QString(HOST_FILE)) && url.count("|") == 3) || - (url.startsWith(QString(RSLINK_SCHEME) + "://" + QString(HOST_PERSON)) && url.count("|") == 2)) + (url.startsWith(QString(RSLINK_SCHEME) + "://" + QString(HOST_PERSON)) && url.count("|") == 2)) { /* Old link, we try it */ QStringList list = url.split ("|"); @@ -187,11 +200,11 @@ template QString decodedQueryItemValue(const QUrl_or_QUrlQuery& urlQuery, const QString& key) { #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) - // Qt5 needs a additional flag to properly decode everything - // we have to decode, becaue we want only decoded stuff in our QString - return urlQuery.queryItemValue(key, QUrl::FullyDecoded); + // Qt5 needs a additional flag to properly decode everything + // we have to decode, because we want only decoded stuff in our QString + return urlQuery.queryItemValue(key, QUrl::FullyDecoded); #else - return urlQuery.queryItemValue(key); + return urlQuery.queryItemValue(key); #endif } @@ -222,7 +235,7 @@ void RetroShareLink::fromUrl(const QUrl& url) bool ok ; _type = TYPE_FILE; - _name = decodedQueryItemValue(urlQuery, FILE_NAME); + _name = decodedQueryItemValue(urlQuery, FILE_NAME); _size = urlQuery.queryItemValue(FILE_SIZE).toULongLong(&ok); _hash = urlQuery.queryItemValue(FILE_HASH).left(40); // normally not necessary, but it's a security. @@ -238,14 +251,72 @@ void RetroShareLink::fromUrl(const QUrl& url) } } - if(url.host() == HOST_PUBLIC_MSG) - { - bool ok ; - _type = TYPE_PUBLIC_MSG ; - _hash = urlQuery.queryItemValue(PUBLIC_MSG_HASH) ; - _time_stamp = urlQuery.queryItemValue(PUBLIC_MSG_TIME_STAMP).toUInt(&ok) ; - _GPGid = urlQuery.queryItemValue(PUBLIC_MSG_SRC_PGP_ID) ; + if (url.host() == HOST_PERSON) { + _type = TYPE_PERSON; + _name = decodedQueryItemValue(urlQuery, PERSON_NAME); + _hash = urlQuery.queryItemValue(PERSON_HASH).left(40); // normally not necessary, but it's a security. +#ifdef DEBUG_RSLINK + std::cerr << "Got a person link!!" << std::endl; +#endif + check(); + return; + } + + if (url.host() == HOST_FORUM) { + _type = TYPE_FORUM; + _name = decodedQueryItemValue(urlQuery, FORUM_NAME); + _hash = urlQuery.queryItemValue(FORUM_ID); + _msgId = urlQuery.queryItemValue(FORUM_MSGID); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a forum link!!" << std::endl; +#endif + check(); + return; + } + + if (url.host() == HOST_CHANNEL) { + _type = TYPE_CHANNEL; + _name = decodedQueryItemValue(urlQuery, CHANNEL_NAME); + _hash = urlQuery.queryItemValue(CHANNEL_ID); + _msgId = urlQuery.queryItemValue(CHANNEL_MSGID); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a channel link!!" << std::endl; +#endif + check(); + return; + } + + if (url.host() == HOST_SEARCH) { + _type = TYPE_SEARCH; + _name = decodedQueryItemValue(urlQuery, SEARCH_KEYWORDS); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a search link!!" << std::endl; +#endif + check(); + return; + } + + if (url.host() == HOST_MESSAGE) { + std::string id = urlQuery.queryItemValue(MESSAGE_ID).toStdString(); + *this = createMessage(RsPeerId(id), urlQuery.queryItemValue(MESSAGE_SUBJECT)); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a message link!!" << std::endl; +#endif + return; + } + + if (url.host() == HOST_CERTIFICATE) { + _type = TYPE_CERTIFICATE; + _radix = decodedQueryItemValue(urlQuery, CERTIFICATE_RADIX); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a certificate link!!" << std::endl; +#endif check() ; return; } @@ -254,10 +325,10 @@ void RetroShareLink::fromUrl(const QUrl& url) bool ok ; _type = TYPE_EXTRAFILE; - _name = decodedQueryItemValue(urlQuery, FILE_NAME); - _size = urlQuery.queryItemValue(FILE_SIZE).toULongLong(&ok); - _hash = urlQuery.queryItemValue(FILE_HASH).left(40); // normally not necessary, but it's a security. - _SSLid = urlQuery.queryItemValue(FILE_SOURCE); + _name = decodedQueryItemValue(urlQuery, EXTRAFILE_NAME); + _size = urlQuery.queryItemValue(EXTRAFILE_SIZE).toULongLong(&ok); + _hash = urlQuery.queryItemValue(EXTRAFILE_HASH).left(40); // normally not necessary, but it's a security. + _SSLid = urlQuery.queryItemValue(EXTRAFILE_SOURCE); if (ok) { #ifdef DEBUG_RSLINK @@ -271,93 +342,82 @@ void RetroShareLink::fromUrl(const QUrl& url) return; } } - if (url.host() == HOST_PERSON) { - _type = TYPE_PERSON; - _name = decodedQueryItemValue(urlQuery, PERSON_NAME); - _hash = urlQuery.queryItemValue(PERSON_HASH).left(40); // normally not necessary, but it's a security. + + //TYPE_PRIVATE_CHAT deprecated + + if(url.host() == HOST_PUBLIC_MSG) + { + bool ok ; + _type = TYPE_PUBLIC_MSG ; + _time_stamp = urlQuery.queryItemValue(PUBLIC_MSG_TIME_STAMP).toUInt(&ok) ; + _hash = urlQuery.queryItemValue(PUBLIC_MSG_HASH) ; + _GPGid = urlQuery.queryItemValue(PUBLIC_MSG_SRC_PGP_ID) ; + +#ifdef DEBUG_RSLINK + std::cerr << "Got a public message link!!" << std::endl; +#endif + check() ; + return; + } + + if (url.host() == HOST_POSTED) { + _type = TYPE_POSTED; + _name = decodedQueryItemValue(urlQuery, POSTED_NAME); + _hash = urlQuery.queryItemValue(POSTED_ID); + _msgId = urlQuery.queryItemValue(POSTED_MSGID); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a posted link!!" << std::endl; +#endif check(); return; } - if (url.host() == HOST_FORUM) { - _type = TYPE_FORUM; - _name = decodedQueryItemValue(urlQuery, FORUM_NAME); - _hash = urlQuery.queryItemValue(FORUM_ID); - _msgId = urlQuery.queryItemValue(FORUM_MSGID); - check(); - return; + if(url.host() == HOST_IDENTITY) { + _type = TYPE_IDENTITY ; + QString gxsid= urlQuery.queryItemValue(IDENTITY_ID) ; + QString name = decodedQueryItemValue(urlQuery, IDENTITY_NAME) ; + QString radix= decodedQueryItemValue(urlQuery, IDENTITY_GROUP) ; + + RsGxsId id(gxsid.toStdString()) ; + + if(!id.isNull()) + *this = createIdentity(id,name,radix) ; +#ifdef DEBUG_RSLINK + std::cerr << "Got an identity link!!" << std::endl; +#endif + else + std::cerr << "(EE) identity link is not valid." << std::endl; + return ; } - if (url.host() == HOST_CHANNEL) { - _type = TYPE_CHANNEL; - _name = decodedQueryItemValue(urlQuery, CHANNEL_NAME); - _hash = urlQuery.queryItemValue(CHANNEL_ID); - _msgId = urlQuery.queryItemValue(CHANNEL_MSGID); - check(); - return; - } - - if (url.host() == HOST_POSTED) { - _type = TYPE_POSTED; - _name = decodedQueryItemValue(urlQuery, POSTED_NAME); - _hash = urlQuery.queryItemValue(POSTED_ID); - _msgId = urlQuery.queryItemValue(POSTED_MSGID); - check(); - return; - } - - if (url.host() == HOST_SEARCH) { - _type = TYPE_SEARCH; - _name = decodedQueryItemValue(urlQuery, SEARCH_KEYWORDS); - check(); - return; - } - - if(url.host() == HOST_IDENTITY) { - _type = TYPE_IDENTITY ; - QString name = decodedQueryItemValue(urlQuery, IDENTITY_NAME) ; - QString radix= decodedQueryItemValue(urlQuery, IDENTITY_GROUP) ; - QString gxsid= urlQuery.queryItemValue(IDENTITY_ID) ; - - RsGxsId id(gxsid.toStdString()) ; - - if(!id.isNull()) - *this = createIdentity(id,name,radix) ; - else - std::cerr << "(EE) identity link is not valid." << std::endl; - return ; - } - - if (url.host() == HOST_MESSAGE) { - std::string id = urlQuery.queryItemValue(MESSAGE_ID).toStdString(); - *this = createMessage(RsPeerId(id), urlQuery.queryItemValue(MESSAGE_SUBJECT)); - return; - } - - if (url.host() == HOST_COLLECTION) { + if (url.host() == HOST_FILE_TREE) { bool ok; _type = TYPE_FILE_TREE; - _radix = decodedQueryItemValue(urlQuery, COLLECTION_DATA); - _name = decodedQueryItemValue(urlQuery, COLLECTION_NAME); - _size = urlQuery.queryItemValue(COLLECTION_SIZE).toULongLong(&ok); - _count = urlQuery.queryItemValue(COLLECTION_COUNT).toULongLong(&ok); + _name = decodedQueryItemValue(urlQuery, FILE_TREE_NAME); + _size = urlQuery.queryItemValue(FILE_TREE_SIZE).toULongLong(&ok); + _radix = decodedQueryItemValue(urlQuery, FILE_TREE_DATA); + _count = urlQuery.queryItemValue(FILE_TREE_COUNT).toULongLong(&ok); #ifdef DEBUG_RSLINK - std::cerr << "Got a certificate link!!" << std::endl; + std::cerr << "Got a file tree link!!" << std::endl; #endif check() ; return; } - if (url.host() == HOST_CERTIFICATE) { - _type = TYPE_CERTIFICATE; - _radix = decodedQueryItemValue(urlQuery, CERTIFICATE_RADIX); + + if (url.host() == HOST_CHAT_ROOM) { + _type = TYPE_CHAT_ROOM; + _name = decodedQueryItemValue(urlQuery, CHAT_ROOM_NAME); + _hash = urlQuery.queryItemValue(CHAT_ROOM_ID); #ifdef DEBUG_RSLINK - std::cerr << "Got a certificate link!!" << std::endl; + std::cerr << "Got a chat room link!!" << std::endl; #endif check() ; return; } + // bad link #ifdef DEBUG_RSLINK @@ -371,39 +431,6 @@ RetroShareLink::RetroShareLink() clear(); } -RetroShareLink RetroShareLink::createIdentity(const RsGxsId& id, const QString& name, const QString& radix_data) -{ - RetroShareLink link; - link.clear(); - - link._name = name; - link._hash = QString::fromStdString(id.toStdString()); - link._radix_group_data = radix_data ; - - link._type = TYPE_IDENTITY; - - link.check(); - - return link; -} - -RetroShareLink RetroShareLink::createExtraFile(const QString& name, uint64_t size, const QString& hash,const QString& ssl_id) -{ - RetroShareLink link; - link.clear(); - - link._name = name; - link._size = size; - link._hash = hash; - link._SSLid = ssl_id; - - link._type = TYPE_EXTRAFILE; - - link.check(); - - return link; -} - RetroShareLink RetroShareLink::createFile(const QString& name, uint64_t size, const QString& hash) { RetroShareLink link; @@ -420,36 +447,6 @@ RetroShareLink RetroShareLink::createFile(const QString& name, uint64_t size, co return link; } -RetroShareLink RetroShareLink::createCollection(const QString& name, uint64_t size, uint32_t count, const QString& radix_data) -{ - RetroShareLink link; - link.clear(); - - link._name = name; - link._count = count; - link._size = size; - link._radix = radix_data ; - link._type = TYPE_FILE_TREE; - - link.check(); - - return link; -} -RetroShareLink RetroShareLink::createPublicMsgInvite(time_t time_stamp,const QString& issuer_pgp_id,const QString& hash) -{ - RetroShareLink link; - link.clear() ; - - link._type = TYPE_PUBLIC_MSG ; - link._time_stamp = time_stamp ; - link._hash = hash ; - link._GPGid = issuer_pgp_id ; - - link.check() ; - - return link; -} - RetroShareLink RetroShareLink::createPerson(const RsPgpId& id) { RetroShareLink link; @@ -460,8 +457,8 @@ RetroShareLink RetroShareLink::createPerson(const RsPgpId& id) std::cerr << "RetroShareLink::createPerson() Couldn't find peer id " << id << std::endl; } else { - link._hash = QString::fromStdString(id.toStdString()); link._name = QString::fromUtf8(detail.name.c_str()); + link._hash = QString::fromStdString(id.toStdString()); link._type = TYPE_PERSON; } @@ -471,98 +468,34 @@ RetroShareLink RetroShareLink::createPerson(const RsPgpId& id) return link; } -RetroShareLink RetroShareLink::createCertificate(const RsPeerId& ssl_id) -{ - RetroShareLink link; - link.clear(); - -#warning csoler 2012-08-14: This is baaaaaad code: - // - we should not need to parse and re-read a cert in old format. - // - RsPeerDetails detail; - if (rsPeers->getPeerDetails(ssl_id, detail) == false) { - std::cerr << "RetroShareLink::createPerson() Couldn't find peer id " << ssl_id << std::endl; - } else { - - link._type = TYPE_CERTIFICATE; - link._radix = QString::fromUtf8(rsPeers->GetRetroshareInvite(ssl_id,false).c_str()); - link._name = QString::fromUtf8(detail.name.c_str()); - link._location = QString::fromUtf8(detail.location.c_str()); - link._radix.replace("\n",""); - - std::cerr << "Found radix = " << link._radix.toStdString() << std::endl; - } - - link.check(); - - return link; -} - -RetroShareLink RetroShareLink::createUnknwonSslCertificate(const RsPeerId& sslId, const RsPgpId& gpgId) -{ - RetroShareLink link; - link.clear(); - - // first try ssl id - link = createCertificate(sslId); - if (link.valid()) { - if (gpgId.isNull() || link._GPGid.toStdString() == gpgId.toStdString()) { - return link; - } - // wrong gpg id - link.clear(); - return link; - } - - // then gpg id - link = createPerson(gpgId); - if (link.valid()) { - if (!link._SSLid.isEmpty()) { - link.clear(); - return link; - } - if (sslId.isNull()) { - link.check(); - return link; - } - link._SSLid = QString::fromStdString(sslId.toStdString()); - if (link._location.isEmpty()) { - link._location = link._name; - } - link.check(); - return link; - } - - link.clear(); - return link; -} - +//For Forum, Channel & Posted RetroShareLink RetroShareLink::createGxsGroupLink(const RetroShareLink::enumType &linkType, const RsGxsGroupId &groupId, const QString &groupName) { RetroShareLink link; link.clear(); if (!groupId.isNull()) { - link._hash = QString::fromStdString(groupId.toStdString()); - link._type = linkType; link._name = groupName; + link._hash = QString::fromStdString(groupId.toStdString()); + + link._type = linkType; } link.check(); return link; } - RetroShareLink RetroShareLink::createGxsMessageLink(const RetroShareLink::enumType &linkType, const RsGxsGroupId &groupId, const RsGxsMessageId &msgId, const QString &msgName) { RetroShareLink link; link.clear(); if (!groupId.isNull() && !msgId.isNull()) { + link._name = msgName; link._hash = QString::fromStdString(groupId.toStdString()); link._msgId = QString::fromStdString(msgId.toStdString()); + link._type = linkType; - link._name = msgName; } link.check(); @@ -615,36 +548,190 @@ RetroShareLink RetroShareLink::createMessage(const RsGxsId& peerId, const QStrin return link; } +RetroShareLink RetroShareLink::createCertificate(const RsPeerId& ssl_id) +{ + RetroShareLink link; + link.clear(); + +#warning csoler 2012-08-14: This is baaaaaad code: + // - we should not need to parse and re-read a cert in old format. + // + RsPeerDetails detail; + if (rsPeers->getPeerDetails(ssl_id, detail) == false) { + std::cerr << "RetroShareLink::createPerson() Couldn't find peer id " << ssl_id << std::endl; + } else { + + link._type = TYPE_CERTIFICATE; + link._radix = QString::fromUtf8(rsPeers->GetRetroshareInvite(ssl_id,false).c_str()); + link._name = QString::fromUtf8(detail.name.c_str()); + link._location = QString::fromUtf8(detail.location.c_str()); + link._radix.replace("\n",""); + + std::cerr << "Found radix = " << link._radix.toStdString() << std::endl; + } + + link.check(); + + return link; +} +RetroShareLink RetroShareLink::createUnknwonSslCertificate(const RsPeerId& sslId, const RsPgpId& gpgId) +{ + RetroShareLink link; + link.clear(); + + // first try ssl id + link = createCertificate(sslId); + if (link.valid()) { + if (gpgId.isNull() || link._GPGid.toStdString() == gpgId.toStdString()) { + return link; + } + // wrong gpg id + link.clear(); + return link; + } + + // then gpg id + link = createPerson(gpgId); + if (link.valid()) { + if (!link._SSLid.isEmpty()) { + link.clear(); + return link; + } + if (sslId.isNull()) { + link.check(); + return link; + } + link._SSLid = QString::fromStdString(sslId.toStdString()); + if (link._location.isEmpty()) { + link._location = link._name; + } + link.check(); + return link; + } + + link.clear(); + return link; +} + +RetroShareLink RetroShareLink::createExtraFile(const QString& name, uint64_t size, const QString& hash,const QString& ssl_id) +{ + RetroShareLink link; + link.clear(); + + link._name = name; + link._size = size; + link._hash = hash; + link._SSLid = ssl_id; + + link._type = TYPE_EXTRAFILE; + + link.check(); + + return link; +} + +//Private Chat deprecated + +RetroShareLink RetroShareLink::createPublicMsgInvite(time_t time_stamp,const QString& issuer_pgp_id,const QString& hash) +{ + RetroShareLink link; + link.clear() ; + + link._type = TYPE_PUBLIC_MSG ; + link._time_stamp = time_stamp ; + link._hash = hash ; + link._GPGid = issuer_pgp_id ; + + link.check() ; + + return link; +} + +RetroShareLink RetroShareLink::createIdentity(const RsGxsId& id, const QString& name, const QString& radix_data) +{ + RetroShareLink link; + link.clear(); + + link._name = name; + link._hash = QString::fromStdString(id.toStdString()); + link._radix_group_data = radix_data ; + + link._type = TYPE_IDENTITY; + + link.check(); + + return link; +} + +RetroShareLink RetroShareLink::createFileTree(const QString& name, uint64_t size, uint32_t count, const QString& radix_data) +{ + RetroShareLink link; + link.clear(); + + link._name = name; + link._size = size; + link._radix = radix_data ; + link._count = count; + + link._type = TYPE_FILE_TREE; + + link.check(); + + return link; +} + +RetroShareLink RetroShareLink::createChatRoom(const ChatId &chatId, const QString &name) +{ + RetroShareLink link; + link.clear(); + + link._name = name; + link._hash = QString::fromStdString(chatId.toStdString()); + + link._type = TYPE_CHAT_ROOM; + + link.check(); + + return link; +} + void RetroShareLink::clear() { - _valid = false; - _type = TYPE_UNKNOWN; - _subType = 0; - _hash = "" ; - _size = 0 ; + _valid = false ; + _type = TYPE_UNKNOWN ; _name = "" ; + _size = 0 ; + _hash = "" ; + _msgId = "" ; + _subject = "" ; + _SSLid = "" ; _GPGid = "" ; + _location = "" ; + _radix = "" ; + _subType = 0 ; _time_stamp = 0 ; - _encrypted_chat_info = "" ; - _radix_group_data = "" ; + //_encrypted_chat_info = "" ; + _radix_group_data = "" ; + _count = 0 ; } void RetroShareLink::check() { _valid = true; - switch (_type) + switch (_type) { case TYPE_UNKNOWN: + /* fallthrough */ case TYPE_PRIVATE_CHAT: _valid = false; - break; + break; case TYPE_EXTRAFILE: if(!checkSSLId(_SSLid)) _valid = false; // no break! We also test file stuff below. /* fallthrough */ case TYPE_FILE_TREE: - + /* fallthrough */ case TYPE_FILE: if(_size > (((uint64_t)1)<<40)) // 1TB. Who has such large files? _valid = false; @@ -654,23 +741,7 @@ void RetroShareLink::check() if(!checkRadix64(_radix)) _valid = false; - break; - - case TYPE_PUBLIC_MSG: - if(!checkHash(_hash)) _valid = false ; - if(!checkPGPId(_GPGid)) _valid = false ; - break ; - - case TYPE_IDENTITY: - if(_name.isNull()) - _valid = false ; - - if(_radix_group_data.isNull()) - _valid = false ; - - if(_hash.isNull()) - _valid = false ; - break ; + break; case TYPE_PERSON: if(_size != 0) @@ -681,7 +752,8 @@ void RetroShareLink::check() if(_hash.isEmpty()) _valid = false; - break; + break; + case TYPE_FORUM: if(_size != 0) _valid = false; @@ -691,7 +763,8 @@ void RetroShareLink::check() if(_hash.isEmpty()) _valid = false; - break; + break; + case TYPE_CHANNEL: if(_size != 0) _valid = false; @@ -701,17 +774,8 @@ void RetroShareLink::check() if(_hash.isEmpty()) _valid = false; - break; - case TYPE_POSTED: - if(_size != 0) - _valid = false; + break; - if(_name.isEmpty()) - _valid = false; - - if(_hash.isEmpty()) - _valid = false; - break; case TYPE_SEARCH: if(_size != 0) _valid = false; @@ -721,16 +785,61 @@ void RetroShareLink::check() if(!_hash.isEmpty()) _valid = false; - break; + break; + case TYPE_MESSAGE: if(_size != 0) _valid = false; if(_hash.isEmpty()) _valid = false; - break; + break; + case TYPE_CERTIFICATE: - break; + break; + + //TYPE_EXTRAFILE done upper + //TYPE_PRIVATE_CHAT done upper (deprecated) + + case TYPE_PUBLIC_MSG: + if(!checkHash(_hash)) _valid = false ; + if(!checkPGPId(_GPGid)) _valid = false ; + break ; + + case TYPE_POSTED: + if(_size != 0) + _valid = false; + + if(_name.isEmpty()) + _valid = false; + + if(_hash.isEmpty()) + _valid = false; + break; + + case TYPE_IDENTITY: + if(_name.isEmpty()) + _valid = false ; + + if(_radix_group_data.isEmpty()) + _valid = false ; + + if(_hash.isEmpty()) + _valid = false ; + break ; + + //TYPE_FILE_TREE done upper + + case TYPE_CHAT_ROOM: + if(_size != 0) + _valid = false; + + if(_name.isEmpty()) + _valid = false; + + if(_hash.isEmpty()) + _valid = false; + break; } if (!_valid) { @@ -746,41 +855,61 @@ QString RetroShareLink::title() const switch (_type) { case TYPE_UNKNOWN: + /* fallthrough */ case TYPE_PRIVATE_CHAT: - break; - case TYPE_PUBLIC_MSG: - { - RsPeerDetails detail; - rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; - return QObject::tr("Click to send a private message to %1 (%2).").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; - } - case TYPE_FILE_TREE: - return QObject::tr("Click to browse/download this file collection"); - case TYPE_EXTRAFILE: - return QObject::tr("%1 (%2, Extra - Source included)").arg(hash()).arg(misc::friendlyUnit(size())); + break; + case TYPE_FILE: - return QString("%1 (%2)").arg(hash()).arg(misc::friendlyUnit(size())); - case TYPE_IDENTITY: - return _name ; + return QString("%1 (%2)").arg(hash()).arg(misc::friendlyUnit(size())); case TYPE_PERSON: - return PeerDefs::rsidFromId(RsPgpId(hash().toStdString())); + return PeerDefs::rsidFromId(RsPgpId(hash().toStdString())); + case TYPE_FORUM: + /* fallthrough */ case TYPE_CHANNEL: - case TYPE_POSTED: + /* fallthrough */ case TYPE_SEARCH: - break; + break; + case TYPE_MESSAGE: - return PeerDefs::rsidFromId(RsPeerId(hash().toStdString())); + return PeerDefs::rsidFromId(RsPeerId(hash().toStdString())); + case TYPE_CERTIFICATE: + { RsPeerDetails details ; uint32_t error_code ; if(!rsPeers->loadDetailsFromStringCert(_radix.toStdString(),details,error_code)) return QObject::tr("This cert is malformed. Error code:")+" "+QString::number(error_code) ; else - return QObject::tr("Click to add this RetroShare cert to your PGP keyring\nand open the Make Friend Wizard.\n") - + QString("PGP Id =")+" " + QString::fromStdString(details.gpg_id.toStdString()) + QString("\nSSLId =")+" "+QString::fromStdString(details.id.toStdString()); + return QObject::tr("Click to add this RetroShare cert to your PGP keyring\nand open the Make Friend Wizard.\n") + + QString("PGP Id =")+" " + QString::fromStdString(details.gpg_id.toStdString()) + QString("\nSSLId =")+" "+QString::fromStdString(details.id.toStdString()); + } + + case TYPE_EXTRAFILE: + return QObject::tr("%1 (%2, Extra - Source included)").arg(hash()).arg(misc::friendlyUnit(size())); + + //TYPE_PRIVATE_CHAT done upper (deprecated) + + case TYPE_PUBLIC_MSG: + { + RsPeerDetails detail; + rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; + return QObject::tr("Click to send a private message to %1 (%2).").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; + } + + case TYPE_POSTED: + break; + + case TYPE_IDENTITY: + return _name ; + + case TYPE_FILE_TREE: + return QObject::tr("Click to browse/download this file collection"); + + case TYPE_CHAT_ROOM: + return _name ; } return ""; @@ -788,7 +917,7 @@ QString RetroShareLink::title() const static QString encodeItem(QString item) { - return QUrl::toPercentEncoding(item); + return QUrl::toPercentEncoding(item); } QString RetroShareLink::toString() const @@ -802,8 +931,9 @@ QString RetroShareLink::toString() const switch (_type) { case TYPE_UNKNOWN: + /* fallthrough */ case TYPE_PRIVATE_CHAT: - return ""; + return ""; case TYPE_FILE: url.setScheme(RSLINK_SCHEME); @@ -812,34 +942,7 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(FILE_SIZE, QString::number(_size)); urlQuery.addQueryItem(FILE_HASH, _hash); - break; - - case TYPE_PUBLIC_MSG: - url.setScheme(RSLINK_SCHEME) ; - url.setHost(HOST_PUBLIC_MSG) ; - urlQuery.addQueryItem(PUBLIC_MSG_TIME_STAMP,QString::number(_time_stamp)) ; - urlQuery.addQueryItem(PUBLIC_MSG_HASH,_hash) ; - urlQuery.addQueryItem(PUBLIC_MSG_SRC_PGP_ID,_GPGid) ; - - break; - - case TYPE_IDENTITY: - url.setScheme(RSLINK_SCHEME) ; - url.setHost(HOST_IDENTITY) ; - urlQuery.addQueryItem(IDENTITY_ID,_hash) ; - urlQuery.addQueryItem(IDENTITY_NAME,encodeItem(_name)) ; - urlQuery.addQueryItem(IDENTITY_GROUP,encodeItem(_radix_group_data)) ; - break ; - - case TYPE_EXTRAFILE: - url.setScheme(RSLINK_SCHEME); - url.setHost(HOST_EXTRAFILE); - urlQuery.addQueryItem(FILE_NAME, encodeItem(_name)); - urlQuery.addQueryItem(FILE_SIZE, QString::number(_size)); - urlQuery.addQueryItem(FILE_HASH, _hash); - urlQuery.addQueryItem(FILE_SOURCE, _SSLid); - - break; + break; case TYPE_PERSON: url.setScheme(RSLINK_SCHEME); @@ -847,7 +950,7 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(PERSON_NAME, encodeItem(_name)); urlQuery.addQueryItem(PERSON_HASH, _hash); - break; + break; case TYPE_FORUM: url.setScheme(RSLINK_SCHEME); @@ -858,7 +961,7 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(FORUM_MSGID, _msgId); } - break; + break; case TYPE_CHANNEL: url.setScheme(RSLINK_SCHEME); @@ -869,25 +972,14 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(CHANNEL_MSGID, _msgId); } - break; - - case TYPE_POSTED: - url.setScheme(RSLINK_SCHEME); - url.setHost(HOST_POSTED); - urlQuery.addQueryItem(POSTED_NAME, encodeItem(_name)); - urlQuery.addQueryItem(POSTED_ID, _hash); - if (!_msgId.isEmpty()) { - urlQuery.addQueryItem(POSTED_MSGID, _msgId); - } - - break; + break; case TYPE_SEARCH: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_SEARCH); urlQuery.addQueryItem(SEARCH_KEYWORDS, encodeItem(_name)); - break; + break; case TYPE_MESSAGE: url.setScheme(RSLINK_SCHEME); @@ -897,16 +989,7 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(MESSAGE_SUBJECT, encodeItem(_subject)); } - break; - - case TYPE_FILE_TREE: - url.setScheme(RSLINK_SCHEME); - url.setHost(HOST_COLLECTION) ; - urlQuery.addQueryItem(COLLECTION_NAME, encodeItem(_name)); - urlQuery.addQueryItem(COLLECTION_SIZE, QString::number(_size)); - urlQuery.addQueryItem(COLLECTION_DATA, encodeItem(_radix)); - urlQuery.addQueryItem(COLLECTION_COUNT, QString::number(_count)); - break; + break; case TYPE_CERTIFICATE: url.setScheme(RSLINK_SCHEME); @@ -914,7 +997,65 @@ QString RetroShareLink::toString() const urlQuery.addQueryItem(CERTIFICATE_RADIX, encodeItem(_radix)); urlQuery.addQueryItem(CERTIFICATE_NAME, encodeItem(_name)); urlQuery.addQueryItem(CERTIFICATE_LOCATION, encodeItem(_location)); - break; + break; + + case TYPE_EXTRAFILE: + url.setScheme(RSLINK_SCHEME); + url.setHost(HOST_EXTRAFILE); + urlQuery.addQueryItem(FILE_NAME, encodeItem(_name)); + urlQuery.addQueryItem(FILE_SIZE, QString::number(_size)); + urlQuery.addQueryItem(FILE_HASH, _hash); + urlQuery.addQueryItem(FILE_SOURCE, _SSLid); + + break; + + //TYPE_PRIVATE_CHAT done upper (deprecated) + + case TYPE_PUBLIC_MSG: + url.setScheme(RSLINK_SCHEME) ; + url.setHost(HOST_PUBLIC_MSG) ; + urlQuery.addQueryItem(PUBLIC_MSG_TIME_STAMP,QString::number(_time_stamp)) ; + urlQuery.addQueryItem(PUBLIC_MSG_HASH,_hash) ; + urlQuery.addQueryItem(PUBLIC_MSG_SRC_PGP_ID,_GPGid) ; + + break; + + case TYPE_POSTED: + url.setScheme(RSLINK_SCHEME); + url.setHost(HOST_POSTED); + urlQuery.addQueryItem(POSTED_NAME, encodeItem(_name)); + urlQuery.addQueryItem(POSTED_ID, _hash); + if (!_msgId.isEmpty()) { + urlQuery.addQueryItem(POSTED_MSGID, _msgId); + } + + break; + + case TYPE_IDENTITY: + url.setScheme(RSLINK_SCHEME) ; + url.setHost(HOST_IDENTITY) ; + urlQuery.addQueryItem(IDENTITY_ID,_hash) ; + urlQuery.addQueryItem(IDENTITY_NAME,encodeItem(_name)) ; + urlQuery.addQueryItem(IDENTITY_GROUP,encodeItem(_radix_group_data)) ; + break ; + + case TYPE_FILE_TREE: + url.setScheme(RSLINK_SCHEME); + url.setHost(HOST_FILE_TREE) ; + urlQuery.addQueryItem(FILE_TREE_NAME, encodeItem(_name)); + urlQuery.addQueryItem(FILE_TREE_SIZE, QString::number(_size)); + urlQuery.addQueryItem(FILE_TREE_DATA, encodeItem(_radix)); + urlQuery.addQueryItem(FILE_TREE_COUNT, QString::number(_count)); + break; + + case TYPE_CHAT_ROOM: + url.setScheme(RSLINK_SCHEME); + url.setHost(HOST_CHAT_ROOM); + urlQuery.addQueryItem(CHAT_ROOM_NAME, encodeItem(_name)); + urlQuery.addQueryItem(CHAT_ROOM_ID, _hash); + + break; + } #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) @@ -927,24 +1068,13 @@ QString RetroShareLink::toString() const QString RetroShareLink::niceName() const { + if(type() == TYPE_FILE) + return QObject::tr("%1 (%2)").arg(_name).arg(misc::friendlyUnit(_size)); + if (type() == TYPE_PERSON) return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); - if(type() == TYPE_FILE_TREE) - return QObject::tr("%1 (%2 files, %3)").arg(_name).arg(_count).arg(misc::friendlyUnit(_size)); - - if(type() == TYPE_IDENTITY) - return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; - - if(type() == TYPE_FILE_TREE) - return QObject::tr("File directory (Total %s) Click to browse/download this file collection").arg(misc::friendlyUnit(_size)); - - if(type() == TYPE_PUBLIC_MSG) { - RsPeerDetails detail; - rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; - return QObject::tr("Click this link to send a private message to %1 (%2)").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; - } - if(type() == TYPE_CERTIFICATE) + if(type() == TYPE_CERTIFICATE) { RsPeerDetails details ; uint32_t error_code ; @@ -955,6 +1085,18 @@ QString RetroShareLink::niceName() const return QObject::tr("RetroShare Certificate (%1, @%2)").arg(QString::fromUtf8(details.name.c_str()), QString::fromUtf8(details.location.c_str())); // should add SSL id there } + if(type() == TYPE_PUBLIC_MSG) { + RsPeerDetails detail; + rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; + return QObject::tr("Click this link to send a private message to %1 (%2)").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; + } + + if(type() == TYPE_IDENTITY) + return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; + + if(type() == TYPE_FILE_TREE) + return QObject::tr("%1 (%2 files, %3)").arg(_name).arg(_count).arg(misc::friendlyUnit(_size)); + return name(); } @@ -995,7 +1137,7 @@ QString RetroShareLink::toHtmlSize() const bool RetroShareLink::checkName(const QString& name) { - if(name == "") + if(name.isEmpty()) return false ; for(int i=0;i processedList; QList errorList; - processedList << &fileAdded << &personAdded << &forumFound << &channelFound << &postedFound << &searchStarted << &messageStarted; - errorList << &fileExist << &personExist << &personFailed << &personNotFound << &forumUnknown << &forumMsgUnknown << &channelUnknown << &channelMsgUnknown << &postedUnknown << &postedMsgUnknown << &messageReceipientNotAccepted << &messageReceipientUnknown; + processedList << &fileAdded << &personAdded << &forumFound << &channelFound << &searchStarted << &messageStarted << &postedFound << &chatroomFound; + errorList << &fileExist << &personExist << &personFailed << &personNotFound << &forumUnknown << &forumMsgUnknown << &channelUnknown << &channelMsgUnknown << &messageReceipientNotAccepted << &messageReceipientUnknown << &postedUnknown << &postedMsgUnknown << &chatroomUnknown; // not needed: forumFound, channelFound, messageStarted // we want to merge all single file links into one collection @@ -1234,323 +1381,364 @@ static void processList(const QStringList &list, const QString &textSingular, co continue; } - switch (link.type()) + switch (link.type()) { case TYPE_UNKNOWN: ++countUnknown; break; - case TYPE_CERTIFICATE: - { + case TYPE_FILE: + { + col.merge_in(link.name(),link.size(),RsFileHash(link.hash().toStdString())) ; + fileLinkFound = true; + } + break; + + case TYPE_PERSON: + { #ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process certificate." << std::endl; + std::cerr << " RetroShareLink::process FriendRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << std::endl; #endif - needNotifySuccess = true; - std::cerr << "Usign this certificate:" << std::endl; - std::cerr << link.radix().toStdString() << std::endl; + RsPeerDetails detail; + if (rsPeers->getGPGDetails(RsPgpId(link.hash().toStdString()), detail)) + PGPKeyDialog::showIt(detail.gpg_id,PGPKeyDialog::PageDetails) ; + else + personNotFound.append(PeerDefs::rsid(link.name().toUtf8().constData(), RsPgpId(link.hash().toStdString()))); + } + break; - ConnectFriendWizard connectFriendWizard; - connectFriendWizard.setCertificate(link.radix(), (link.subType() == RSLINK_SUBTYPE_CERTIFICATE_USER_REQUEST) ? true : false); - connectFriendWizard.exec(); - needNotifySuccess = false; + case TYPE_FORUM: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process ForumRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; +#endif + + MainWindow::showWindow(MainWindow::Forums); + GxsForumsDialog *forumsDialog = dynamic_cast(MainWindow::getPage(MainWindow::Forums)); + if (!forumsDialog) { + return false; } - break ; - case TYPE_PUBLIC_MSG: + if (forumsDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { + if (link.msgId().isEmpty()) { + forumFound.append(link.name()); + } else { + forumMsgFound.append(link.name()); + } + } else { + if (link.msgId().isEmpty()) { + forumUnknown.append(link.name()); + } else { + forumMsgUnknown.append(link.name()); + } + } + } + break; + + case TYPE_CHANNEL: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process ChannelRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; +#endif + + MainWindow::showWindow(MainWindow::Channels); + GxsChannelDialog *channelDialog = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); + if (!channelDialog) { + return false; + } + + if (channelDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { + if (link.msgId().isEmpty()) { + channelFound.append(link.name()); + } else { + channelMsgFound.append(link.name()); + } + } else { + if (link.msgId().isEmpty()) { + channelUnknown.append(link.name()); + } else { + channelMsgUnknown.append(link.name()); + } + } + } + break; + + case TYPE_SEARCH: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process SearchRequest : string : " << link.name().toStdString() << std::endl; +#endif + SearchDialog *searchDialog = dynamic_cast(MainWindow::getPage(MainWindow::Search)); + if (!searchDialog) { - std::cerr << "(!!) Distant messages from links is disabled for now" << std::endl; - // std::cerr << "Opening a public msg window " << std::endl; - // std::cerr << " time_stamp = " << link._time_stamp << std::endl; - // std::cerr << " hash = " << link._hash.toStdString() << std::endl; - // std::cerr << " Issuer Id = " << link._GPGid.toStdString() << std::endl; - // - // if(link._time_stamp < time(NULL)) - // { - // QMessageBox::information(NULL,QObject::tr("Messaging link is expired"),QObject::tr("This Messaging link is expired. The destination peer will not receive it.")) ; - // break ; - // } - // - // MessageComposer::msgDistantPeer(link._hash.toStdString(),link._GPGid.toStdString()) ; + std::cerr << "Retrieve of search dialog failed. Please debug!" << std::endl; + break; } - break ; - case TYPE_IDENTITY: - { - if(rsIdentity->deserialiseIdentityFromMemory(link.radixGroupData().toStdString())) - QMessageBox::information(NULL,QObject::tr("Identity added to People"),QObject::tr("The identity was added to people. You can now chat with it, send messages to it, etc.")) ; - else - QMessageBox::warning(NULL,QObject::tr("Identity cannot be added to People"),QObject::tr("The identity was not added to people. Some error occured. The link is probably corrupted.")) ; - } - break; + MainWindow::showWindow(MainWindow::Search); + searchDialog->searchKeywords(link.name()); + searchStarted.append(link.name()); + } + break; + + case TYPE_MESSAGE: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process MessageRequest : id : " << link.hash().toStdString() << ", subject : " << link.name().toStdString() << std::endl; +#endif + RsPeerDetails detail; + + // This is awful, but apparently the hash can be multiple different types. Let's check! + + RsPeerId ssl_id(link.hash().toStdString()) ; + + if(!ssl_id.isNull() && rsPeers->getPeerDetails(ssl_id,detail) && detail.accept_connection) + { + MessageComposer *msg = MessageComposer::newMsg(); + msg->addRecipient(MessageComposer::TO, detail.id); + if (link.subject().isEmpty() == false) { + msg->setTitleText(link.subject()); + } + msg->show(); + messageStarted.append(PeerDefs::nameWithLocation(detail)); + break ; + } + + RsIdentityDetails gxs_details ; + RsGxsId gxs_id(link.hash().toStdString()) ; + + if(!gxs_id.isNull() && rsIdentity->getIdDetails(gxs_id,gxs_details)) + { + if(gxs_details.mFlags & RS_IDENTITY_FLAGS_IS_OWN_ID) + { + QMessageBox::warning(NULL,QString("Cannot send message to yourself"),QString("This identity is owned by you. You wouldn't want to send yourself a message right?")); + break ; + } + + MessageComposer *msg = MessageComposer::newMsg(); + msg->addRecipient(MessageComposer::TO, gxs_id) ; + + if (link.subject().isEmpty() == false) + msg->setTitleText(link.subject()); + + msg->show(); + messageStarted.append(PeerDefs::nameWithLocation(gxs_details)); + + break ; + } + messageReceipientUnknown.append(PeerDefs::rsidFromId(RsPeerId(link.hash().toStdString()))); + } + break; + + case TYPE_CERTIFICATE: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process certificate." << std::endl; +#endif + needNotifySuccess = true; + + std::cerr << "Usign this certificate:" << std::endl; + std::cerr << link.radix().toStdString() << std::endl; + + ConnectFriendWizard connectFriendWizard; + connectFriendWizard.setCertificate(link.radix(), (link.subType() == RSLINK_SUBTYPE_CERTIFICATE_USER_REQUEST) ? true : false); + connectFriendWizard.exec(); + needNotifySuccess = false; + } + break ; case TYPE_EXTRAFILE: { #ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process FileRequest : fileName : " << link.name().toUtf8().constData() << ". fileHash : " << link.hash().toStdString() << ". fileSize : " << link.size() << std::endl; + std::cerr << " RetroShareLink::process FileRequest : fileName : " << link.name().toUtf8().constData() << ". fileHash : " << link.hash().toStdString() << ". fileSize : " << link.size() << std::endl; #endif - needNotifySuccess = true; - std::list srcIds; + needNotifySuccess = true; + std::list srcIds; - // Add the link built-in source. This is needed for EXTRA files, where the source is specified in the link. + // Add the link built-in source. This is needed for EXTRA files, where the source is specified in the link. - if(link.type() == TYPE_EXTRAFILE) - { + if(link.type() == TYPE_EXTRAFILE) + { #ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process Adding built-in source " << link.SSLId().toStdString() << std::endl; + std::cerr << " RetroShareLink::process Adding built-in source " << link.SSLId().toStdString() << std::endl; #endif - srcIds.push_back(RsPeerId(link.SSLId().toStdString())) ; - } + srcIds.push_back(RsPeerId(link.SSLId().toStdString())) ; + } - // Get a list of available direct sources, in case the file is browsable only. - // - FileInfo finfo ; - rsFiles->FileDetails(RsFileHash(link.hash().toStdString()), RS_FILE_HINTS_REMOTE, finfo) ; + // Get a list of available direct sources, in case the file is browsable only. + // + FileInfo finfo ; + rsFiles->FileDetails(RsFileHash(link.hash().toStdString()), RS_FILE_HINTS_REMOTE, finfo) ; - for(std::list::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) - { + for(std::list::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) + { #ifdef DEBUG_RSLINK - std::cerr << " adding peerid " << (*it).peerId << std::endl ; + std::cerr << " adding peerid " << (*it).peerId << std::endl ; #endif - srcIds.push_back((*it).peerId) ; - } + srcIds.push_back((*it).peerId) ; + } - QString cleanname = link.name() ; - static const QString bad_chars_str = "/\\\"*:?<>|" ; + QString cleanname = link.name() ; + static const QString bad_chars_str = "/\\\"*:?<>|" ; - for(int i=0;ialreadyHaveFile(RsFileHash(link.hash().toStdString()), fi)) { - /* make path for downloaded file */ - std::string path; - path = fi.path;//Shared files has path with filename included - - //Seems that all FileInfo get .path==filepath+filename - //if (fi.downloadStatus == FT_STATE_COMPLETE) - // path = fi.path + "/" + fi.fname; - - QFileInfo qinfo; - qinfo.setFile(QString::fromUtf8(path.c_str())); - if (qinfo.exists() && qinfo.isFile() && !dontOpenNextFile) { - QString question = ""; - question += QObject::tr("Warning: Retroshare is about to ask your system to open this file. "); - question += QObject::tr("Before you do so, please make sure that this file does not contain malicious executable code."); - question += "

" + cleanname + ""; - - QMessageBox mb(QObject::tr("Confirmation"), question, QMessageBox::Warning, QMessageBox::Yes, QMessageBox::No, links.size()>1 ? QMessageBox::NoToAll : 0, 0); - int ret = mb.exec(); - if(ret == QMessageBox::Yes) { - ++countFileOpened; - bFileOpened = true; - /* open file with a suitable application */ - if (!RsUrlHandler::openUrl(QUrl::fromLocalFile(qinfo.absoluteFilePath()))) { - std::cerr << "RetroShareLink::process(): can't open file " << path << std::endl; - } - } else if (ret == QMessageBox::NoToAll) { - dontOpenNextFile = true; + for(int i=0;ialreadyHaveFile(RsFileHash(link.hash().toStdString()), fi)) { + /* make path for downloaded file */ + std::string path; + path = fi.path;//Shared files has path with filename included + + //Seems that all FileInfo get .path==filepath+filename + //if (fi.downloadStatus == FT_STATE_COMPLETE) + // path = fi.path + "/" + fi.fname; + + QFileInfo qinfo; + qinfo.setFile(QString::fromUtf8(path.c_str())); + if (qinfo.exists() && qinfo.isFile() && !dontOpenNextFile) { + QString question = ""; + question += QObject::tr("Warning: Retroshare is about to ask your system to open this file. "); + question += QObject::tr("Before you do so, please make sure that this file does not contain malicious executable code."); + question += "

" + cleanname + ""; + + QMessageBox mb(QObject::tr("Confirmation"), question, QMessageBox::Warning, QMessageBox::Yes, QMessageBox::No, links.size()>1 ? QMessageBox::NoToAll : 0, 0); + int ret = mb.exec(); + if(ret == QMessageBox::Yes) { + ++countFileOpened; + bFileOpened = true; + /* open file with a suitable application */ + if (!RsUrlHandler::openUrl(QUrl::fromLocalFile(qinfo.absoluteFilePath()))) { + std::cerr << "RetroShareLink::process(): can't open file " << path << std::endl; } + } else if (ret == QMessageBox::NoToAll) { + dontOpenNextFile = true; } } + } - if (rsFiles->FileRequest(cleanname.toUtf8().constData(), RsFileHash(link.hash().toStdString()), link.size(), "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds)) { - fileAdded.append(link.name()); - } else { - if (!bFileOpened) fileExist.append(link.name()); - } + if (rsFiles->FileRequest(cleanname.toUtf8().constData(), RsFileHash(link.hash().toStdString()), link.size(), "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds)) { + fileAdded.append(link.name()); + } else { + if (!bFileOpened) fileExist.append(link.name()); + } } break; - case TYPE_FILE: - col.merge_in(link.name(),link.size(),RsFileHash(link.hash().toStdString())) ; - fileLinkFound = true; + //TYPE_PRIVATE_CHAT + + case TYPE_PUBLIC_MSG: + { + std::cerr << "(!!) Distant messages from links is disabled for now" << std::endl; + // std::cerr << "Opening a public msg window " << std::endl; + // std::cerr << " time_stamp = " << link._time_stamp << std::endl; + // std::cerr << " hash = " << link._hash.toStdString() << std::endl; + // std::cerr << " Issuer Id = " << link._GPGid.toStdString() << std::endl; + // + // if(link._time_stamp < time(NULL)) + // { + // QMessageBox::information(NULL,QObject::tr("Messaging link is expired"),QObject::tr("This Messaging link is expired. The destination peer will not receive it.")) ; + // break ; + // } + // + // MessageComposer::msgDistantPeer(link._hash.toStdString(),link._GPGid.toStdString()) ; + } + break ; + + case TYPE_POSTED: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process PostedRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; +#endif + + MainWindow::showWindow(MainWindow::Posted); + PostedDialog *postedDialog = dynamic_cast(MainWindow::getPage(MainWindow::Posted)); + + if (!postedDialog) { + return false; + } + + if (postedDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { + if (link.msgId().isEmpty()) { + postedFound.append(link.name()); + } else { + postedMsgFound.append(link.name()); + } + } else { + if (link.msgId().isEmpty()) { + postedUnknown.append(link.name()); + } else { + postedMsgUnknown.append(link.name()); + } + } + } break; + case TYPE_IDENTITY: + { + if(rsIdentity->deserialiseIdentityFromMemory(link.radixGroupData().toStdString())) + QMessageBox::information(NULL,QObject::tr("Identity added to People"),QObject::tr("The identity was added to people. You can now chat with it, send messages to it, etc.")) ; + else + QMessageBox::warning(NULL,QObject::tr("Identity cannot be added to People"),QObject::tr("The identity was not added to people. Some error occured. The link is probably corrupted.")) ; + } + break; case TYPE_FILE_TREE: - { - FileTree *ft = FileTree::create(link.radix().toStdString()) ; + { + FileTree *ft = FileTree::create(link.radix().toStdString()) ; - RsCollection(*ft).downloadFiles() ; + RsCollection(*ft).downloadFiles() ; - delete ft; - } - break; - - case TYPE_PERSON: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process FriendRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << std::endl; -#endif - - RsPeerDetails detail; - if (rsPeers->getGPGDetails(RsPgpId(link.hash().toStdString()), detail)) - PGPKeyDialog::showIt(detail.gpg_id,PGPKeyDialog::PageDetails) ; - else - personNotFound.append(PeerDefs::rsid(link.name().toUtf8().constData(), RsPgpId(link.hash().toStdString()))); - } + delete ft; + } break; - - case TYPE_FORUM: - { + case TYPE_CHAT_ROOM: + { #ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process ForumRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; + std::cerr << " RetroShareLink::process ChatRoom Request : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << std::endl; #endif + ChatId chatId(link.id().toStdString()); - MainWindow::showWindow(MainWindow::Forums); - GxsForumsDialog *forumsDialog = dynamic_cast(MainWindow::getPage(MainWindow::Forums)); - if (!forumsDialog) { + if (chatId.isBroadcast()) + { + MainWindow::showWindow(MainWindow::Network); + chatroomFound.append(link.name()); + } + else if (chatId.isNotSet()) + chatroomUnknown.append(link.name()); + else if (chatId.isLobbyId()) + { + MainWindow::showWindow(MainWindow::ChatLobby); + ChatLobbyWidget *chatLobbyDialog = dynamic_cast(MainWindow::getPage(MainWindow::ChatLobby)); + if (!chatLobbyDialog) { return false; } - - if (forumsDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { - if (link.msgId().isEmpty()) { - forumFound.append(link.name()); - } else { - forumMsgFound.append(link.name()); - } + if (chatLobbyDialog->showLobbyAnchor(chatId.toLobbyId(),"")) { + chatroomFound.append(link.name()); } else { - if (link.msgId().isEmpty()) { - forumUnknown.append(link.name()); - } else { - forumMsgUnknown.append(link.name()); - } + chatroomUnknown.append(link.name()); } } - break; - - case TYPE_CHANNEL: + else { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process ChannelRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; -#endif - - MainWindow::showWindow(MainWindow::Channels); - GxsChannelDialog *channelDialog = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); - if (!channelDialog) { - return false; - } - - if (channelDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { - if (link.msgId().isEmpty()) { - channelFound.append(link.name()); - } else { - channelMsgFound.append(link.name()); - } + ChatDialog* chatDialog = ChatDialog::getChat(chatId, Settings->getChatFlags()); + if (chatDialog != NULL) { + chatroomFound.append(link.name()); } else { - if (link.msgId().isEmpty()) { - channelUnknown.append(link.name()); - } else { - channelMsgUnknown.append(link.name()); - } + chatroomUnknown.append(link.name()); } } - break; - - case TYPE_POSTED: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process PostedRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << ". msgId : " << link.msgId().toStdString() << std::endl; -#endif - - MainWindow::showWindow(MainWindow::Posted); - PostedDialog *postedDialog = dynamic_cast(MainWindow::getPage(MainWindow::Posted)); - - if (!postedDialog) { - return false; - } - - if (postedDialog->navigate(RsGxsGroupId(link.id().toStdString()), RsGxsMessageId(link.msgId().toStdString()))) { - if (link.msgId().isEmpty()) { - postedFound.append(link.name()); - } else { - postedMsgFound.append(link.name()); - } - } else { - if (link.msgId().isEmpty()) { - postedUnknown.append(link.name()); - } else { - postedMsgUnknown.append(link.name()); - } - } - } - break; - - case TYPE_SEARCH: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process SearchRequest : string : " << link.name().toStdString() << std::endl; -#endif - SearchDialog *searchDialog = dynamic_cast(MainWindow::getPage(MainWindow::Search)); - if (!searchDialog) - { - std::cerr << "Retrieve of search dialog failed. Please debug!" << std::endl; - break; - } - - MainWindow::showWindow(MainWindow::Search); - searchDialog->searchKeywords(link.name()); - searchStarted.append(link.name()); - } - break; - - case TYPE_MESSAGE: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process MessageRequest : id : " << link.hash().toStdString() << ", subject : " << link.name().toStdString() << std::endl; -#endif - RsPeerDetails detail; - - // This is awful, but apparently the hash can be multiple different types. Let's check! - - RsPeerId ssl_id(link.hash().toStdString()) ; - - if(!ssl_id.isNull() && rsPeers->getPeerDetails(ssl_id,detail) && detail.accept_connection) - { - MessageComposer *msg = MessageComposer::newMsg(); - msg->addRecipient(MessageComposer::TO, detail.id); - if (link.subject().isEmpty() == false) { - msg->setTitleText(link.subject()); - } - msg->show(); - messageStarted.append(PeerDefs::nameWithLocation(detail)); - break ; - } - - RsIdentityDetails gxs_details ; - RsGxsId gxs_id(link.hash().toStdString()) ; - - if(!gxs_id.isNull() && rsIdentity->getIdDetails(gxs_id,gxs_details)) - { - if(gxs_details.mFlags & RS_IDENTITY_FLAGS_IS_OWN_ID) - { - QMessageBox::warning(NULL,QString("Cannot send message to yourself"),QString("This identity is owned by you. You wouldn't want to send yourself a message right?")); - break ; - } - - MessageComposer *msg = MessageComposer::newMsg(); - msg->addRecipient(MessageComposer::TO, gxs_id) ; - - if (link.subject().isEmpty() == false) - msg->setTitleText(link.subject()); - - msg->show(); - messageStarted.append(PeerDefs::nameWithLocation(gxs_details)); - - break ; - } - messageReceipientUnknown.append(PeerDefs::rsidFromId(RsPeerId(link.hash().toStdString()))); - } + } break; default: @@ -1639,16 +1827,6 @@ static void processList(const QStringList &list, const QString &textSingular, co } } - // posted - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - if (!postedUnknown.isEmpty()) { - processList(postedUnknown, QObject::tr("Posted not found"), QObject::tr("Posted not found"), result); - } - if (!postedMsgUnknown.isEmpty()) { - processList(postedMsgUnknown, QObject::tr("Posted message not found"), QObject::tr("Posted messages not found"), result); - } - } - // message if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { if (!messageReceipientNotAccepted.isEmpty()) { @@ -1659,6 +1837,23 @@ static void processList(const QStringList &list, const QString &textSingular, co } } + // posted + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (!postedUnknown.isEmpty()) { + processList(postedUnknown, QObject::tr("Posted not found"), QObject::tr("Posted not found"), result); + } + if (!postedMsgUnknown.isEmpty()) { + processList(postedMsgUnknown, QObject::tr("Posted message not found"), QObject::tr("Posted messages not found"), result); + } + } + + // chat room + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (!chatroomUnknown.isEmpty()) { + processList(chatroomUnknown, QObject::tr("Chat room not found"), QObject::tr("Chat room not found"), result); + } + } + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { if (countUnknown) { result += QString("
%1: %2").arg(QObject::tr("Malformed links")).arg(countUnknown); @@ -1675,7 +1870,6 @@ static void processList(const QStringList &list, const QString &textSingular, co mb.exec(); } - return 0; } diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index 43ca67ab0..d94588e18 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -32,23 +32,25 @@ // shared | Y | Y | Y (send RS link) | Paste menu? | Paste menu? // -------------+----------------+--------------------------+------------------+-------------+------------- // -#include -#include #include +#include +#include #include -#include #include +#include -#define RSLINK_PROCESS_NOTIFY_SUCCESS 1 // notify on success -#define RSLINK_PROCESS_NOTIFY_ERROR 2 // notify on error -#define RSLINK_PROCESS_NOTIFY_ASK 4 // ask for add the links -#define RSLINK_PROCESS_NOTIFY_BAD_CHARS 8 // / or \\ characters in a filename +#include -#define RSLINK_PROCESS_NOTIFY_ALL 15 +#define RSLINK_PROCESS_NOTIFY_SUCCESS 1 // notify on success +#define RSLINK_PROCESS_NOTIFY_ERROR 2 // notify on error +#define RSLINK_PROCESS_NOTIFY_ASK 4 // ask for add the links +#define RSLINK_PROCESS_NOTIFY_BAD_CHARS 8 // / or \\ characters in a filename -#define RSLINK_SCHEME "retroshare" +#define RSLINK_PROCESS_NOTIFY_ALL 15 + +#define RSLINK_SCHEME "retroshare" #define RSLINK_SUBTYPE_CERTIFICATE_USER_REQUEST 1 #define RSLINK_SUBTYPE_FILE_EXTRA 2 @@ -57,20 +59,21 @@ class RetroShareLink { public: enum enumType { - TYPE_UNKNOWN = 0x00, - TYPE_FILE = 0x01, - TYPE_PERSON = 0x02, - TYPE_FORUM = 0x03, - TYPE_CHANNEL = 0x04, - TYPE_SEARCH = 0x05, - TYPE_MESSAGE = 0x06, - TYPE_CERTIFICATE = 0x07, - TYPE_EXTRAFILE = 0x08, - TYPE_PRIVATE_CHAT = 0x09, - TYPE_PUBLIC_MSG = 0x0a, - TYPE_POSTED = 0x0b, - TYPE_IDENTITY = 0x0c, - TYPE_FILE_TREE = 0x0d + TYPE_UNKNOWN = 0x00, + TYPE_FILE = 0x01, + TYPE_PERSON = 0x02, + TYPE_FORUM = 0x03, + TYPE_CHANNEL = 0x04, + TYPE_SEARCH = 0x05, + TYPE_MESSAGE = 0x06, + TYPE_CERTIFICATE = 0x07, + TYPE_EXTRAFILE = 0x08, + TYPE_PRIVATE_CHAT = 0x09,//Deprecated + TYPE_PUBLIC_MSG = 0x0a, + TYPE_POSTED = 0x0b, + TYPE_IDENTITY = 0x0c, + TYPE_FILE_TREE = 0x0d, + TYPE_CHAT_ROOM = 0x0e }; public: @@ -78,43 +81,47 @@ class RetroShareLink RetroShareLink(const QUrl& url); RetroShareLink(const QString& url); - static RetroShareLink createIdentity(const RsGxsId& gxs_id,const QString& name,const QString& radix_data) ; - static RetroShareLink createExtraFile(const QString& name, uint64_t size, const QString& hash, const QString& ssl_id); static RetroShareLink createFile(const QString& name, uint64_t size, const QString& hash); - static RetroShareLink createCollection(const QString& name, uint64_t size,uint32_t count,const QString& radix_data); - static RetroShareLink createPublicMsgInvite(time_t time_stamp,const QString& pgp_id,const QString& hash) ; static RetroShareLink createPerson(const RsPgpId &id); - static RetroShareLink createCertificate(const RsPeerId &ssl_id) ; - static RetroShareLink createUnknwonSslCertificate(const RsPeerId &sslId, const RsPgpId &gpgId = RsPgpId()) ; static RetroShareLink createGxsGroupLink(const RetroShareLink::enumType &linkType, const RsGxsGroupId &groupId, const QString &groupName); static RetroShareLink createGxsMessageLink(const RetroShareLink::enumType &linkType, const RsGxsGroupId &groupId, const RsGxsMessageId &msgId, const QString &msgName); static RetroShareLink createSearch(const QString& keywords); static RetroShareLink createMessage(const RsPeerId &peerId, const QString& subject); static RetroShareLink createMessage(const RsGxsId &peerId, const QString& subject); + static RetroShareLink createCertificate(const RsPeerId &ssl_id) ; + static RetroShareLink createUnknwonSslCertificate(const RsPeerId &sslId, const RsPgpId &gpgId = RsPgpId()) ; + static RetroShareLink createExtraFile(const QString& name, uint64_t size, const QString& hash, const QString& ssl_id); + static RetroShareLink createPublicMsgInvite(time_t time_stamp,const QString& pgp_id,const QString& hash) ; + static RetroShareLink createIdentity(const RsGxsId& gxs_id,const QString& name,const QString& radix_data) ; + static RetroShareLink createFileTree(const QString& name, uint64_t size,uint32_t count,const QString& radix_data); + static RetroShareLink createChatRoom(const ChatId &chatId, const QString& name); + bool valid() const { return _valid; } enumType type() const {return _type; } - uint64_t size() const { return _size ; } const QString& name() const { return _name ; } + uint64_t size() const { return _size ; } const QString& hash() const { return _hash ; } const QString& id() const { return _hash ; } const QString& msgId() const { return _msgId ; } const QString& subject() const { return _subject ; } - const QString& GPGRadix64Key() const { return _GPGBase64String ; } - const QString& GPGBase64CheckSum() const { return _GPGBase64CheckSum ; } const QString& SSLId() const { return _SSLid ; } const QString& GPGId() const { return _GPGid ; } - const QString& localIPAndPort() const { return _loc_ip_port ; } - const QString& externalIPAndPort() const { return _ext_ip_port ; } - const QString& dyndns() const { return _dyndns_name ; } + //const QString& GPGRadix64Key() const { return _GPGBase64String ; } + //const QString& GPGBase64CheckSum() const { return _GPGBase64CheckSum ; } const QString& location() const { return _location ; } + //const QString& externalIPAndPort() const { return _ext_ip_port ; } + //const QString& localIPAndPort() const { return _loc_ip_port ; } + //const QString& dyndns() const { return _dyndns_name ; } const QString& radix() const { return _radix ; } time_t timeStamp() const { return _time_stamp ; } - QString title() const; - QString radixGroupData() const { return _radix_group_data ;} + QString radixGroupData() const { return _radix_group_data ;} + uint32_t count() const { return _count ; } unsigned int subType() const { return _subType; } void setSubType(unsigned int subType) { _subType = subType; } + // get title depends link's type + QString title() const; // get nice name for anchor QString niceName() const; @@ -132,8 +139,6 @@ class RetroShareLink QUrl toUrl() const ; - bool valid() const { return _valid; } - bool operator==(const RetroShareLink& l) const { return _type == l._type && _hash == l._hash ; } static int process(const QStringList &urls, RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, uint flag = RSLINK_PROCESS_NOTIFY_ALL); @@ -154,21 +159,21 @@ class RetroShareLink enumType _type; QString _name; uint64_t _size; - QString _hash; // or id (forum, channel, message) + QString _hash; // or id (forum, channel, message, chat room) QString _msgId; // id of the message (forum, channel) QString _subject; QString _SSLid ; // ssl id for rs links QString _GPGid ; // ssl id for rs links - QString _GPGBase64String ; // GPG Cert - QString _GPGBase64CheckSum ; // GPG Cert + //QString _GPGBase64String ; // GPG Cert + //QString _GPGBase64CheckSum ; // GPG Cert QString _location ; // location - QString _ext_ip_port ; - QString _loc_ip_port ; - QString _dyndns_name ; - QString _radix ; - QString _encrypted_chat_info ; // encrypted data string for the recipient of a chat invite + //QString _ext_ip_port ; + //QString _loc_ip_port ; + //QString _dyndns_name ; + QString _radix ; + //QString _encrypted_chat_info ; // encrypted data string for the recipient of a chat invite time_t _time_stamp ; // time stamp at which the link will expire. - QString _radix_group_data; + QString _radix_group_data; uint32_t _count ; unsigned int _subType; // for general use as sub type for _type (RSLINK_SUBTYPE_...) diff --git a/retroshare-gui/src/gui/chat/ChatDialog.cpp b/retroshare-gui/src/gui/chat/ChatDialog.cpp index 9fe8220ab..678cd0f93 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatDialog.cpp @@ -38,7 +38,7 @@ #include #include -static std::map chatDialogs2; +static std::map chatDialogsList; ChatDialog::ChatDialog(QWidget *parent, Qt::WindowFlags flags) : QWidget(parent, flags) @@ -49,8 +49,8 @@ ChatDialog::ChatDialog(QWidget *parent, Qt::WindowFlags flags) : ChatDialog::~ChatDialog() { std::map::iterator it; - if (chatDialogs2.end() != (it = chatDialogs2.find(mChatId))) { - chatDialogs2.erase(it); + if (chatDialogsList.end() != (it = chatDialogsList.find(mChatId))) { + chatDialogsList.erase(it); } } @@ -78,7 +78,7 @@ void ChatDialog::init(const ChatId &id, const QString &title) /*static*/ ChatDialog* ChatDialog::getExistingChat(ChatId id) { std::map::iterator it; - if (chatDialogs2.end() != (it = chatDialogs2.find(id))) { + if (chatDialogsList.end() != (it = chatDialogsList.find(id))) { /* exists already */ return it->second; } @@ -122,7 +122,7 @@ void ChatDialog::init(const ChatId &id, const QString &title) } } if(cd) - chatDialogs2[id] = cd; + chatDialogsList[id] = cd; } } @@ -142,14 +142,14 @@ void ChatDialog::init(const ChatId &id, const QString &title) /* ChatDialog destuctor removes the entry from the map */ std::list list; - std::map::iterator it; - for (it = chatDialogs2.begin(); it != chatDialogs2.end(); ++it) { + std::map::iterator it; + for (it = chatDialogsList.begin(); it != chatDialogsList.end(); ++it) { if (it->second) { list.push_back(it->second); } } - chatDialogs2.clear(); + chatDialogsList.clear(); std::list::iterator it1; for (it1 = list.begin(); it1 != list.end(); ++it1) { diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index c9fa3bc65..a8e95dabf 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -172,7 +172,7 @@ ChatWidget::ChatWidget(QWidget *parent) : connect(ui->textBrowser, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint))); - connect(ui->chatTextEdit, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint))); + //connect(ui->chatTextEdit, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint))); // reset text and color after removing all characters from the QTextEdit and after calling QTextEdit::clear connect(ui->chatTextEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(chatCharFormatChanged())); connect(ui->chatTextEdit, SIGNAL(textChanged()), this, SLOT(updateLenOfChatTextEdit())); diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index cbe524cf7..312946f08 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -229,7 +229,6 @@ bool RsHtml::canReplaceAnchor(QDomDocument &/*doc*/, QDomElement &/*element*/, c switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: - case RetroShareLink::TYPE_FILE_TREE: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: @@ -240,6 +239,8 @@ bool RsHtml::canReplaceAnchor(QDomDocument &/*doc*/, QDomElement &/*element*/, c case RetroShareLink::TYPE_PUBLIC_MSG: case RetroShareLink::TYPE_POSTED: case RetroShareLink::TYPE_IDENTITY: + case RetroShareLink::TYPE_FILE_TREE: + case RetroShareLink::TYPE_CHAT_ROOM: // not yet implemented break; @@ -260,7 +261,6 @@ void RsHtml::anchorStylesheetForImg(QDomDocument &/*doc*/, QDomElement &/*elemen switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: - case RetroShareLink::TYPE_FILE_TREE: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: @@ -271,6 +271,8 @@ void RsHtml::anchorStylesheetForImg(QDomDocument &/*doc*/, QDomElement &/*elemen case RetroShareLink::TYPE_PUBLIC_MSG: case RetroShareLink::TYPE_POSTED: case RetroShareLink::TYPE_IDENTITY: + case RetroShareLink::TYPE_FILE_TREE: + case RetroShareLink::TYPE_CHAT_ROOM: // not yet implemented break;