From 2fac47293e82f894bd9827c5a2385a74e9178ec3 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Sun, 11 Sep 2011 22:07:24 +0000 Subject: [PATCH] Reworked the process of the RetroShare links. Now RetroShare asks when adding a file or a person link and shows a detailed result. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4604 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/gui/ChannelFeed.cpp | 2 +- retroshare-gui/src/gui/ForumsDialog.cpp | 26 +- retroshare-gui/src/gui/ForumsDialog.h | 1 + retroshare-gui/src/gui/FriendsDialog.cpp | 4 +- retroshare-gui/src/gui/MainWindow.cpp | 4 +- retroshare-gui/src/gui/MessengerWindow.cpp | 2 +- retroshare-gui/src/gui/NetworkDialog.cpp | 2 +- retroshare-gui/src/gui/RetroShareLink.cpp | 695 ++++++++++++------ retroshare-gui/src/gui/RetroShareLink.h | 14 +- retroshare-gui/src/gui/SearchDialog.cpp | 4 +- retroshare-gui/src/gui/SharedFilesDialog.cpp | 2 +- retroshare-gui/src/gui/TransfersDialog.cpp | 4 +- retroshare-gui/src/gui/feeds/ChanMsgItem.cpp | 2 +- .../src/gui/msgs/MessageComposer.cpp | 4 +- retroshare-gui/src/lang/retroshare_de.qm | Bin 330696 -> 330816 bytes retroshare-gui/src/lang/retroshare_de.ts | 288 ++++++-- 16 files changed, 721 insertions(+), 333 deletions(-) diff --git a/retroshare-gui/src/gui/ChannelFeed.cpp b/retroshare-gui/src/gui/ChannelFeed.cpp index 67b71436b..854142dda 100644 --- a/retroshare-gui/src/gui/ChannelFeed.cpp +++ b/retroshare-gui/src/gui/ChannelFeed.cpp @@ -227,7 +227,7 @@ void ChannelFeed::copyChannelLink() if (rsChannels->getChannelInfo(mChannelId, ci)) { RetroShareLink link; if (link.createChannel(ci.channelId, "")) { - std::vector urls; + QList urls; urls.push_back(link); RSLinkClipboard::copyLinks(urls); } diff --git a/retroshare-gui/src/gui/ForumsDialog.cpp b/retroshare-gui/src/gui/ForumsDialog.cpp index 6154db251..8a1507e2b 100644 --- a/retroshare-gui/src/gui/ForumsDialog.cpp +++ b/retroshare-gui/src/gui/ForumsDialog.cpp @@ -749,6 +749,21 @@ void ForumsDialog::fillThreadFinished() CleanupItems (thread->items); } + if (thread->focusMsgId.empty() == false) { + /* Search exisiting item */ + QTreeWidgetItemIterator itemIterator(ui.threadTreeWidget); + QTreeWidgetItem *item = NULL; + while ((item = *itemIterator) != NULL) { + itemIterator++; + + if (item->data(COLUMN_THREAD_DATA, ROLE_THREAD_MSGID).toString().toStdString() == thread->focusMsgId) { + ui.threadTreeWidget->setCurrentItem(item); + ui.threadTreeWidget->setFocus(); + break; + } + } + } + QList::iterator Item; for (Item = thread->itemToExpand.begin(); Item != thread->itemToExpand.end(); Item++) { if ((*Item)->isHidden() == false) { @@ -1141,7 +1156,7 @@ void ForumsDialog::downloadAllFiles() return; } - RetroShareLink::process(urls, RetroShareLink::TYPE_FILE, true); + RetroShareLink::process(urls, RetroShareLink::TYPE_FILE/*, true*/); } // TODO @@ -1319,7 +1334,7 @@ void ForumsDialog::copyForumLink() if (rsForums->getForumInfo(mCurrForumId, fi)) { RetroShareLink link; if (link.createForum(fi.forumId, "")) { - std::vector urls; + QList urls; urls.push_back(link); RSLinkClipboard::copyLinks(urls); } @@ -1336,7 +1351,7 @@ void ForumsDialog::copyMessageLink() if (rsForums->getForumInfo(mCurrForumId, fi)) { RetroShareLink link; if (link.createForum(mCurrForumId, mCurrThreadId)) { - std::vector urls; + QList urls; urls.push_back(link); RSLinkClipboard::copyLinks(urls); } @@ -1596,6 +1611,11 @@ bool ForumsDialog::navigate(const std::string& forumId, const std::string& msgId return true; } + if (fillThread && fillThread->isRunning()) { + fillThread->focusMsgId = msgId; + return true; + } + /* Search exisiting item */ QTreeWidgetItemIterator itemIterator(ui.threadTreeWidget); QTreeWidgetItem *item = NULL; diff --git a/retroshare-gui/src/gui/ForumsDialog.h b/retroshare-gui/src/gui/ForumsDialog.h index f4c854b2e..4f1c06c8f 100644 --- a/retroshare-gui/src/gui/ForumsDialog.h +++ b/retroshare-gui/src/gui/ForumsDialog.h @@ -167,6 +167,7 @@ public: bool fillComplete; int viewType; bool expandNewMessages; + std::string focusMsgId; QList items; QList itemToExpand; diff --git a/retroshare-gui/src/gui/FriendsDialog.cpp b/retroshare-gui/src/gui/FriendsDialog.cpp index 86d08cae8..9aca8c808 100644 --- a/retroshare-gui/src/gui/FriendsDialog.cpp +++ b/retroshare-gui/src/gui/FriendsDialog.cpp @@ -1227,7 +1227,7 @@ void FriendsDialog::recommendfriend() void FriendsDialog::pastePerson() { - RSLinkClipboard::process(RetroShareLink::TYPE_PERSON, RSLINK_PROCESS_NOTIFY_ERROR); + RSLinkClipboard::process(RetroShareLink::TYPE_PERSON); } void FriendsDialog::copyLink() @@ -1238,7 +1238,7 @@ void FriendsDialog::copyLink() return; } - std::vector urls; + QList urls; RetroShareLink link; if (link.createPerson(c->data(COLUMN_DATA, ROLE_ID).toString().toStdString())) { urls.push_back(link); diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index b7ea70675..091f4248c 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -1549,5 +1549,7 @@ void MainWindow::linkActivated(const QUrl &url) return; } - link.process(RSLINK_PROCESS_NOTIFY_ERROR | RSLINK_PROCESS_NOTIFY_SUCCESS); + QList links; + links.append(link); + RetroShareLink::process(links); } diff --git a/retroshare-gui/src/gui/MessengerWindow.cpp b/retroshare-gui/src/gui/MessengerWindow.cpp index 871e50a24..23feee547 100644 --- a/retroshare-gui/src/gui/MessengerWindow.cpp +++ b/retroshare-gui/src/gui/MessengerWindow.cpp @@ -1030,7 +1030,7 @@ void MessengerWindow::recommendfriend() void MessengerWindow::pastePerson() { - RSLinkClipboard::process(RetroShareLink::TYPE_PERSON, RSLINK_PROCESS_NOTIFY_ERROR); + RSLinkClipboard::process(RetroShareLink::TYPE_PERSON); } #endif // MINIMAL_RSGUI diff --git a/retroshare-gui/src/gui/NetworkDialog.cpp b/retroshare-gui/src/gui/NetworkDialog.cpp index cb6121e23..a89ff880e 100644 --- a/retroshare-gui/src/gui/NetworkDialog.cpp +++ b/retroshare-gui/src/gui/NetworkDialog.cpp @@ -302,7 +302,7 @@ void NetworkDialog::copyLink() std::string peer_id = wi->text(COLUMN_PEERID).toStdString() ; - std::vector urls; + QList urls; RetroShareLink link; if (link.createPerson(peer_id)) { urls.push_back(link); diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index eacd1b672..afab6c525 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -624,275 +624,491 @@ bool RetroShareLink::checkHash(const QString& hash) return true ; } -bool RetroShareLink::process(int flag) +static void processList(QStringList &list, const QString &textSingular, const QString &textPlural, QString &result) { - if (valid() == false) { - std::cerr << " RetroShareLink::process invalid request" << std::endl; - return false; + if (list.size() == 0) { + return; + } + if (list.size() == 1) { + result += "" + textSingular + ":"; + } else { + result += "" + textPlural + ":"; + } + result += "

"; + QStringList::iterator it; + for (it = list.begin(); it != list.end(); ++it) { + if (it != list.begin()) { + result += ", "; + } + result += *it; + } + result += "

"; +} + +/*static*/ int RetroShareLink::process(QList &linksIn, uint flag /*= RSLINK_PROCESS_NOTIFY_ALL*/) +{ + QList::iterator linkIt; + + /* filter dublicate links */ + QList links; + for (linkIt = linksIn.begin(); linkIt != linksIn.end(); linkIt++) { + if (links.contains(*linkIt)) { + continue; + } + + links.append(*linkIt); } - switch (type()) { - case TYPE_UNKNOWN: - break; + if (flag & RSLINK_PROCESS_NOTIFY_ASK) { + /* ask for some types of link */ + QStringList fileAdd; + QStringList personAdd; - case TYPE_FILE: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process FileRequest : fileName : " << name().toUtf8().constData() << ". fileHash : " << hash().toStdString() << ". fileSize : " << size() << std::endl; -#endif + for (linkIt = links.begin(); linkIt != links.end(); linkIt++) { + RetroShareLink &link = *linkIt; - // Get a list of available direct sources, in case the file is browsable only. - std::list srcIds; - FileInfo finfo ; - rsFiles->FileDetails(hash().toStdString(), RS_FILE_HINTS_REMOTE,finfo) ; + if (link.valid() == false) { + continue; + } - for(std::list::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) + switch (link.type()) { + case TYPE_UNKNOWN: + case TYPE_FORUM: + case TYPE_CHANNEL: + case TYPE_SEARCH: + case TYPE_MESSAGE: + // no need to ask + break; + + case TYPE_FILE: + fileAdd.append(link.name()); + break; + + case TYPE_PERSON: + personAdd.append(PeerDefs::rsid(link.name().toUtf8().constData(), link.hash().toStdString())); + break; + } + } + + QString content; + if (fileAdd.size()) { + processList(fileAdd, QObject::tr("Add file"), QObject::tr("Add files"), content); + } + + if (personAdd.size()) { + processList(personAdd, QObject::tr("Add friend"), QObject::tr("Add friends"), content); + } + + if (content.isEmpty() == false) { + QString question = ""; + if (links.size() == 1) { + question += QObject::tr("Do you want to process the link ?"); + } else { + question += QObject::tr("Do you want to process %1 links ?").arg(links.size()); + } + question += "

" + content + ""; + + QMessageBox mb(QObject::tr("Confirmation"), question, QMessageBox::Question, QMessageBox::Yes,QMessageBox::No, 0); + mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); + if (mb.exec() == QMessageBox::No) { + return 0; + } + } + } + + int countInvalid = 0; + int countUnknown = 0; + bool needNotifySuccess = false; + + // file + QStringList fileAdded; + QStringList fileExist; + + // person + QStringList personAdded; + QStringList personExist; + QStringList personFailed; + QStringList personNotFound; + + // forum + QStringList forumFound; + QStringList forumMsgFound; + QStringList forumUnknown; + QStringList forumMsgUnknown; + + // forum + QStringList channelFound; + QStringList channelMsgFound; + QStringList channelUnknown; + QStringList channelMsgUnknown; + + // search + QStringList searchStarted; + + // message + QStringList messageStarted; + QStringList messageReceipientNotAccepted; + QStringList messageReceipientUnknown; + + // summary + QList processedList; + QList errorList; + + processedList << &fileAdded << &personAdded << &forumFound << &channelFound << &searchStarted << &messageStarted; + errorList << &fileExist << &personExist << &personFailed << &personNotFound << &forumUnknown << &forumMsgUnknown << &channelUnknown << &channelMsgUnknown << &messageReceipientNotAccepted << &messageReceipientUnknown; + // not needed: forumFound, channelFound, messageStarted + + for (linkIt = links.begin(); linkIt != links.end(); linkIt++) { + RetroShareLink &link = *linkIt; + + if (link.valid() == false) { + std::cerr << " RetroShareLink::process invalid request" << std::endl; + countInvalid++; + continue; + } + + switch (link.type()) { + case TYPE_UNKNOWN: + countUnknown++; + break; + + case TYPE_FILE: { #ifdef DEBUG_RSLINK - std::cerr << " adding peerid " << (*it).peerId << std::endl ; + std::cerr << " RetroShareLink::process FileRequest : fileName : " << link.name().toUtf8().constData() << ". fileHash : " << link.hash().toStdString() << ". fileSize : " << link.size() << std::endl; #endif - srcIds.push_back((*it).peerId) ; - } - if (rsFiles->FileRequest(name().toUtf8().constData(), hash().toStdString(), size(), "", RS_FILE_HINTS_NETWORK_WIDE, srcIds)) { - if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { - QMessageBox mb(QObject::tr("File Request Confirmation"), QObject::tr("The file has been added to your download list."),QMessageBox::Information,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return true; - } + needNotifySuccess = true; - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("File Request canceled"), QObject::tr("The file has not been added to your download list, because you already have it."),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } + // Get a list of available direct sources, in case the file is browsable only. + std::list srcIds; + FileInfo finfo ; + rsFiles->FileDetails(link.hash().toStdString(), RS_FILE_HINTS_REMOTE, finfo) ; - case TYPE_PERSON: - { + for(std::list::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) + { #ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process FriendRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << std::endl; + std::cerr << " adding peerid " << (*it).peerId << std::endl ; #endif - - RsPeerDetails detail; - if (rsPeers->getPeerDetails(hash().toStdString(), detail)) { - if (detail.gpg_id == rsPeers->getGPGOwnId()) { - // it's me, do nothing - return true; + srcIds.push_back((*it).peerId) ; } - if (detail.accept_connection) { - // peer connection is already accepted - if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { - QMessageBox mb(QObject::tr("Friend Request Confirmation"), QObject::tr("The friend is already in your list."),QMessageBox::Information,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return true; - } - - if (rsPeers->addFriend("", hash().toStdString())) { - ConfCertDialog::loadAll(); - if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { - QMessageBox mb(QObject::tr("Friend Request Confirmation"), QObject::tr("The friend has been added to your list."),QMessageBox::Information,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return true; - } - - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Friend Request canceled"), QObject::tr("The friend could not be added to your list."),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Friend Request canceled"), QObject::tr("The friend could not be found."),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - - case TYPE_FORUM: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process ForumRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl; -#endif - - ForumInfo fi; - if (!rsForums->getForumInfo(id().toStdString(), fi)) { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Forum Request canceled"), QObject::tr("The forum \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - - ForumMsgInfo msg; - if (!msgId().isEmpty()) { - if (!rsForums->getForumMessage(fi.forumId, msgId().toStdString(), msg)) { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Forum Request canceled"), QObject::tr("The forum message in forum \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - } - - MainWindow::showWindow(MainWindow::Forums); - ForumsDialog *forumsDialog = dynamic_cast(MainWindow::getPage(MainWindow::Forums)); - if (!forumsDialog) { - return false; - } - - return forumsDialog->navigate(fi.forumId, msg.msgId); - } - - case TYPE_CHANNEL: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process ChannelRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl; -#endif - - ChannelInfo ci; - if (!rsChannels->getChannelInfo(id().toStdString(), ci)) { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Channel Request canceled"), QObject::tr("The channel \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - - ChannelMsgInfo msg; - if (!msgId().isEmpty()) { - if (!rsChannels->getChannelMessage(ci.channelId, msgId().toStdString(), msg)) { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Channel Request canceled"), QObject::tr("The channel message in channel \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - return false; - } - } - - MainWindow::showWindow(MainWindow::Channels); - ChannelFeed *channelFeed = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); - if (!channelFeed) { - return false; - } - - return channelFeed->navigate(ci.channelId, msg.msgId); - } - - case TYPE_SEARCH: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process SearchRequest : string : " << name().toStdString() << std::endl; -#endif - - MainWindow::showWindow(MainWindow::Search); - SearchDialog *searchDialog = dynamic_cast(MainWindow::getPage(MainWindow::Search)); - if (!searchDialog) { - return false; - } - - searchDialog->searchKeywords(name()); - return true; - } - - case TYPE_MESSAGE: - { -#ifdef DEBUG_RSLINK - std::cerr << " RetroShareLink::process MessageRequest : id : " << _hash.toStdString() << ", subject : " << name().toStdString() << std::endl; -#endif - RsPeerDetails detail; - if (rsPeers->getPeerDetails(hash().toStdString(), detail)) { - if (detail.accept_connection || detail.id == rsPeers->getOwnId() || detail.id == rsPeers->getGPGOwnId()) { - MessageComposer *msg = MessageComposer::newMsg(); - msg->addRecipient(MessageComposer::TO, detail.id, false); - if (subject().isEmpty() == false) { - msg->insertTitleText(subject()); - } - msg->show(); - - return true; + if (rsFiles->FileRequest(link.name().toUtf8().constData(), link.hash().toStdString(), link.size(), "", RS_FILE_HINTS_NETWORK_WIDE, srcIds)) { + fileAdded.append(link.name()); } else { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Message Request canceled"), QObject::tr("Cannot send a message to a not accepted receipient \"%1\".").arg(hash()), QMessageBox::Critical, QMessageBox::Ok, 0, 0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - } - } else { - if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("Message Request canceled"), QObject::tr("The receipient of the message is unknown."), QMessageBox::Critical, QMessageBox::Ok, 0, 0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); + fileExist.append(link.name()); } + break; } - return false; + case TYPE_PERSON: + { +#ifdef DEBUG_RSLINK + std::cerr << " RetroShareLink::process FriendRequest : name : " << link.name().toStdString() << ". id : " << link.hash().toStdString() << std::endl; +#endif + + needNotifySuccess = true; + + RsPeerDetails detail; + if (rsPeers->getPeerDetails(link.hash().toStdString(), detail)) { + if (detail.gpg_id == rsPeers->getGPGOwnId()) { + // it's me, do nothing + break; + } + + if (detail.accept_connection) { + // peer connection is already accepted + personExist.append(PeerDefs::rsid(detail)); + break; + } + + if (rsPeers->addFriend("", link.hash().toStdString())) { + ConfCertDialog::loadAll(); + personAdded.append(PeerDefs::rsid(detail)); + break; + } + + personFailed.append(PeerDefs::rsid(link.name().toUtf8().constData(), link.hash().toStdString())); + break; + } + + personNotFound.append(PeerDefs::rsid(link.name().toUtf8().constData(), link.hash().toStdString())); + break; + } + + 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 + + ForumInfo fi; + if (!rsForums->getForumInfo(link.id().toStdString(), fi)) { + if (link.msgId().isEmpty()) { + forumUnknown.append(link.name()); + } else { + forumMsgUnknown.append(link.name()); + } + break; + } + + ForumMsgInfo msg; + if (!link.msgId().isEmpty()) { + if (!rsForums->getForumMessage(fi.forumId, link.msgId().toStdString(), msg)) { + forumMsgUnknown.append(link.name()); + break; + } + } + + MainWindow::showWindow(MainWindow::Forums); + ForumsDialog *forumsDialog = dynamic_cast(MainWindow::getPage(MainWindow::Forums)); + if (!forumsDialog) { + return false; + } + + if (forumsDialog->navigate(fi.forumId, msg.msgId)) { + 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 + + ChannelInfo ci; + if (!rsChannels->getChannelInfo(link.id().toStdString(), ci)) { + if (link.msgId().isEmpty()) { + channelUnknown.append(link.name()); + } else { + channelMsgUnknown.append(link.name()); + } + break; + } + + ChannelMsgInfo msg; + if (!link.msgId().isEmpty()) { + if (!rsChannels->getChannelMessage(ci.channelId, link.msgId().toStdString(), msg)) { + channelMsgUnknown.append(link.name()); + break; + } + } + + MainWindow::showWindow(MainWindow::Channels); + ChannelFeed *channelFeed = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); + if (!channelFeed) { + return false; + } + + if (channelFeed->navigate(ci.channelId, msg.msgId)) { + 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 + + MainWindow::showWindow(MainWindow::Search); + SearchDialog *searchDialog = dynamic_cast(MainWindow::getPage(MainWindow::Search)); + if (!searchDialog) { + break; + } + + 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; + if (rsPeers->getPeerDetails(link.hash().toStdString(), detail)) { + if (detail.accept_connection || detail.id == rsPeers->getOwnId() || detail.id == rsPeers->getGPGOwnId()) { + MessageComposer *msg = MessageComposer::newMsg(); + msg->addRecipient(MessageComposer::TO, detail.id, false); + if (link.subject().isEmpty() == false) { + msg->insertTitleText(link.subject()); + } + msg->show(); + messageStarted.append(PeerDefs::nameWithLocation(detail)); + } else { + messageReceipientNotAccepted.append(PeerDefs::nameWithLocation(detail)); + } + } else { + messageReceipientUnknown.append(PeerDefs::rsidFromId(link.hash().toStdString())); + } + + break; + } + + default: + std::cerr << " RetroShareLink::process unknown type: " << link.type() << std::endl; + countUnknown++; } } - std::cerr << " RetroShareLink::process unknown type: " << type() << std::endl; + int countProcessed = 0; + int countError = 0; + + QList::iterator listIt; + for (listIt = processedList.begin(); listIt != processedList.end(); ++listIt) { + countProcessed += (*listIt)->size(); + } + for (listIt = errorList.begin(); listIt != errorList.end(); ++listIt) { + countError += (*listIt)->size(); + } + + // success notify needed ? + if (needNotifySuccess == false) { + flag &= ~RSLINK_PROCESS_NOTIFY_SUCCESS; + } + // error notify needed ? + if (countError == 0) { + flag &= ~RSLINK_PROCESS_NOTIFY_ERROR; + } + + QString result; + + if (flag & (RSLINK_PROCESS_NOTIFY_SUCCESS | RSLINK_PROCESS_NOTIFY_ERROR)) { + result += (links.count() == 1 ? QObject::tr("%1 of %2 RetroShare link processed.") : QObject::tr("%1 of %2 RetroShare links processed.")).arg(countProcessed).arg(links.count()) + "

"; + } + + // file + if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { + if (fileAdded.size()) { + processList(fileAdded, QObject::tr("File added"), QObject::tr("Files added"), result); + } + } + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (fileExist.size()) { + processList(fileExist, QObject::tr("File exist"), QObject::tr("Files exist"), result); + } + } + + // person + if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { + if (personAdded.size()) { + processList(personAdded, QObject::tr("Friend added"), QObject::tr("Friends added"), result); + } + } + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (personExist.size()) { + processList(personExist, QObject::tr("Friend exist"), QObject::tr("Friends exist"), result); + } + if (personFailed.size()) { + processList(personFailed, QObject::tr("Friend not added"), QObject::tr("Friends not added"), result); + } + if (personNotFound.size()) { + processList(personNotFound, QObject::tr("Friend not found"), QObject::tr("Friends not found"), result); + } + } + + // forum + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (forumUnknown.size()) { + processList(forumUnknown, QObject::tr("Forum not found"), QObject::tr("Forums not found"), result); + } + if (forumMsgUnknown.size()) { + processList(forumMsgUnknown, QObject::tr("Forum message not found"), QObject::tr("Forum messages not found"), result); + } + } + + // channel + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (channelUnknown.size()) { + processList(channelUnknown, QObject::tr("Channel not found"), QObject::tr("Channels not found"), result); + } + if (channelMsgUnknown.size()) { + processList(channelMsgUnknown, QObject::tr("Channel message not found"), QObject::tr("Channel messages not found"), result); + } + } + + // message + if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { + if (messageReceipientNotAccepted.size()) { + processList(messageReceipientNotAccepted, QObject::tr("Receipient not accepted"), QObject::tr("Receipients not accepted"), result); + } + if (messageReceipientUnknown.size()) { + processList(messageReceipientUnknown, QObject::tr("Unkown receipient"), QObject::tr("Unkown receipients"), result); + } + } if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { - QMessageBox mb(QObject::tr("File Request Error"), QObject::tr("The file link is malformed."),QMessageBox::Critical,QMessageBox::Ok,0,0); + if (countUnknown) { + result += QString("
%1: %2").arg(QObject::tr("Malformed links")).arg(countUnknown); + } + if (countInvalid) { + result += QString("
%1: %2").arg(QObject::tr("Invalid links")).arg(countInvalid); + } + } + + if (result.isEmpty() == false) { + QMessageBox mb(QObject::tr("Result"), "" + result + "", QMessageBox::Information, QMessageBox::Ok, 0, 0); mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); mb.exec(); } - return false; + + return 0; } -/*static*/ int RetroShareLink::process(QStringList &urls, RetroShareLink::enumType type /*= RetroShareLink::TYPE_UNKNOWN*/, bool notify /*= true*/) +/*static*/ int RetroShareLink::process(QStringList &urls, RetroShareLink::enumType type /*= RetroShareLink::TYPE_UNKNOWN*/, uint flag /*= RSLINK_PROCESS_NOTIFY_ALL*/) { - int processed = 0; + QList links; for (QStringList::iterator it = urls.begin(); it != urls.end(); it++) { RetroShareLink link(*it); if (link.valid() && (type == RetroShareLink::TYPE_UNKNOWN || link.type() == type)) { - if (link.process(0)) { - processed++; - } + links.append(link); } } - if (notify) { - QString text = QObject::tr("%1 of %2 RetroShare links processed.").arg(processed).arg(urls.count()); - QMessageBox mb(QObject::tr("Request Confirmation"), text, QMessageBox::Information, QMessageBox::Ok, 0, 0); - mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); - mb.exec(); - } - - return processed; + return process(links, flag); } -void RSLinkClipboard::copyLinks(const std::vector& links) +void RSLinkClipboard::copyLinks(const QList& links) { QString res ; - for(uint32_t i=0;isetText(res) ; } -void RSLinkClipboard::pasteLinks(std::vector &links) +void RSLinkClipboard::pasteLinks(QList &links) { return parseClipboard(links); } -void RSLinkClipboard::parseClipboard(std::vector &links) +void RSLinkClipboard::parseClipboard(QList &links) { // parse clipboard for links. // @@ -914,12 +1130,12 @@ void RSLinkClipboard::parseClipboard(std::vector &links) { // check that the link is not already in the list: bool already = false ; - for(uint32_t i=0;i &links) QString RSLinkClipboard::toString() { - std::vector links; + QList links; parseClipboard(links); QString res ; - for(uint32_t i=0;i links; + QList links; parseClipboard(links); QString res ; - for(uint32_t i=0;i" ; return res ; @@ -964,11 +1180,11 @@ QString RSLinkClipboard::toHtml() QString RSLinkClipboard::toHtmlFull() { - std::vector links; + QList links; parseClipboard(links); QString res ; - for(uint32_t i=0;i" ; return res ; @@ -976,14 +1192,14 @@ QString RSLinkClipboard::toHtmlFull() bool RSLinkClipboard::empty(RetroShareLink::enumType type /*= RetroShareLink::TYPE_UNKNOWN*/) { - std::vector links; + QList links; parseClipboard(links); if (type == RetroShareLink::TYPE_UNKNOWN) { return links.empty(); } - for (std::vector::iterator link = links.begin(); link != links.end(); link++) { + for (QList::iterator link = links.begin(); link != links.end(); link++) { if (link->type() == type) { return false; } @@ -992,20 +1208,21 @@ bool RSLinkClipboard::empty(RetroShareLink::enumType type /*= RetroShareLink::TY return true; } -/*static*/ int RSLinkClipboard::process(RetroShareLink::enumType type /*= RetroShareLink::TYPE_UNKNOWN*/, int flag /*= RSLINK_PROCESS_NOTIFY_ALL*/) +/*static*/ int RSLinkClipboard::process(RetroShareLink::enumType type /*= RetroShareLink::TYPE_UNKNOWN*/, uint flag /*= RSLINK_PROCESS_NOTIFY_ALL*/) { - std::vector links; + QList links; pasteLinks(links); - int count = 0; - - for (uint32_t i = 0; i < links.size(); i++) { + QList linksToProcess; + for (int i = 0; i < links.size(); i++) { if (links[i].valid() && (type == RetroShareLink::TYPE_UNKNOWN || links[i].type() == type)) { - if (links[i].process(flag)) { - count++; - } + linksToProcess.append(links[i]); } } - return count; + if (linksToProcess.size() == 0) { + return 0; + } + + return RetroShareLink::process(linksToProcess, flag); } diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index 260ffb9ad..853799926 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -39,6 +39,7 @@ #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_ALL -1 @@ -91,9 +92,8 @@ class RetroShareLink bool operator==(const RetroShareLink& l) const { return _type == l._type && _hash == l._hash ; } - bool process(int flag); - - static int process(QStringList &urls, RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, bool notify = true); + static int process(QStringList &urls, RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, uint flag = RSLINK_PROCESS_NOTIFY_ALL); + static int process(QList &links, uint flag = RSLINK_PROCESS_NOTIFY_ALL); private: void fromString(const QString &url); @@ -125,12 +125,12 @@ class RSLinkClipboard public: // Copy these links to the RS clipboard. Also copy them to the system clipboard // - static void copyLinks(const std::vector& links) ; + static void copyLinks(const QList& links) ; // Get the liste of pasted links, either from the internal RS links, or by default // from the clipboard. // - static void pasteLinks(std::vector &links) ; + static void pasteLinks(QList &links) ; // Produces a list of links with no html structure. static QString toString() ; @@ -155,10 +155,10 @@ class RSLinkClipboard // Returns the count of processed links // Useful for menus. // - static int process(RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, int flag = RSLINK_PROCESS_NOTIFY_ALL); + static int process(RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, uint flag = RSLINK_PROCESS_NOTIFY_ALL); private: - static void parseClipboard(std::vector &links) ; + static void parseClipboard(QList &links) ; }; #endif diff --git a/retroshare-gui/src/gui/SearchDialog.cpp b/retroshare-gui/src/gui/SearchDialog.cpp index 9afb1608c..e00e55d4e 100644 --- a/retroshare-gui/src/gui/SearchDialog.cpp +++ b/retroshare-gui/src/gui/SearchDialog.cpp @@ -507,7 +507,7 @@ void SearchDialog::copySearchLink() RetroShareLink link; if (link.createSearch(keywords)) { - std::vector urls; + QList urls; urls.push_back(link); RSLinkClipboard::copyLinks(urls); } @@ -1305,7 +1305,7 @@ void SearchDialog::copyResultLink() int numdls = itemsForCopy.size(); QTreeWidgetItem * item; - std::vector urls ; + QList urls ; for (int i = 0; i < numdls; ++i) { diff --git a/retroshare-gui/src/gui/SharedFilesDialog.cpp b/retroshare-gui/src/gui/SharedFilesDialog.cpp index 49c433d97..694959961 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/SharedFilesDialog.cpp @@ -446,7 +446,7 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) else localModel->getDirDetailsFromSelect(lst, dirVec); - std::vector urls ; + QList urls ; for (int i = 0, n = dirVec.size(); i < n; ++i) { diff --git a/retroshare-gui/src/gui/TransfersDialog.cpp b/retroshare-gui/src/gui/TransfersDialog.cpp index 9a941dea4..84fbe5d9e 100644 --- a/retroshare-gui/src/gui/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/TransfersDialog.cpp @@ -1131,7 +1131,7 @@ void TransfersDialog::cancel() void TransfersDialog::copyLink () { - std::vector links ; + QList links ; std::set items; std::set::iterator it; @@ -1274,7 +1274,7 @@ void TransfersDialog::updateDetailsDialog() void TransfersDialog::pasteLink() { - RSLinkClipboard::process(RetroShareLink::TYPE_FILE, RSLINK_PROCESS_NOTIFY_ERROR); + RSLinkClipboard::process(RetroShareLink::TYPE_FILE); } void TransfersDialog::getSelectedItems(std::set *ids, std::set *rows) diff --git a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp index 491cf7a84..cb5ccc42b 100644 --- a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp @@ -407,7 +407,7 @@ void ChanMsgItem::copyLink() if (rsChannels->getChannelMessage(mChanId, mMsgId, cmi)) { RetroShareLink link; if (link.createChannel(cmi.channelId, cmi.msgId)) { - std::vector urls; + QList urls; urls.push_back(link); RSLinkClipboard::copyLinks(urls); } diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.cpp b/retroshare-gui/src/gui/msgs/MessageComposer.cpp index 1fce28ed0..f2c23336b 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.cpp +++ b/retroshare-gui/src/gui/msgs/MessageComposer.cpp @@ -515,10 +515,10 @@ void MessageComposer::contextMenuMsgSendList(QPoint) void MessageComposer::pasteRecommended() { - std::vector links; + QList links; RSLinkClipboard::pasteLinks(links); - for (uint32_t i = 0; i < links.size(); i++) { + for (int i = 0; i < links.size(); i++) { if (links[i].valid() && links[i].type() == RetroShareLink::TYPE_FILE) { FileInfo fileInfo; fileInfo.fname = links[i].name().toStdString(); diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm index 504143a3da82bcc7badfc1c53c488316a84af116..f1e28443dc75bef96e09e3757a6659086b873273 100644 GIT binary patch delta 7817 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 oIg_)EdChkH&9U1#*865Tb#C3V7R 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 Setzt Schriftart auf Codestil - + To An @@ -6399,7 +6399,7 @@ Bitte gib etwas Speicher frei und drücke OK. Blockquote hinzufügen - + &Left &Links @@ -6420,12 +6420,12 @@ Bitte gib etwas Speicher frei und drücke OK. - + Save Message Nachricht speichern - + Message has not been Sent. Do you want to save message to draft box? Nachricht wurde noch nicht gesendet. @@ -6473,7 +6473,7 @@ Möchtest Du die Nachricht in den Entwürfen speichern? Fwd: - + RetroShare @@ -6668,7 +6668,7 @@ Willst Du die Nachricht speichern ? Datei nicht gefunden oder Dateiname nicht akzeptiert. - + Friend Recommendation(s) Freundempfehlung(en) @@ -7650,7 +7650,7 @@ p, li { white-space: pre-wrap; } NetworkDialog - + Personal signature Persönliche Unterschrift @@ -7795,7 +7795,7 @@ p, li { white-space: pre-wrap; } Leeren - + Deny friend Blockiere Freund @@ -7825,12 +7825,12 @@ p, li { white-space: pre-wrap; } Kopiere RetroShare Link - + Unknown Unbekannt - + Authentication matrix Authentifizierungsmatrix @@ -7840,7 +7840,7 @@ p, li { white-space: pre-wrap; } Netzwerk Ansicht - + yourself selbst @@ -9475,132 +9475,280 @@ Lockdatei: Vielleicht ist das Passwort falsch - File Request Confirmation - Bestätigung der Dateianforderung + Bestätigung der Dateianforderung - The file has been added to your download list. - Die Datei wurde zur Downloadliste hinzugefügt. + Die Datei wurde zur Downloadliste hinzugefügt. - File Request canceled Dateianforderung abgebrochen - + The following has not been added to your download list, because you already have it: Die folgende Datei wurde nicht zur Downloadliste hinzugefügt, da Du diese schon hast: - The file has not been added to your download list, because you already have it. - Die Datei wurde nicht zur Downloadliste hinzugefügt, da Du sie schon hast. + Die Datei wurde nicht zur Downloadliste hinzugefügt, da Du sie schon hast. - - Friend Request Confirmation - Freundanfrage bestätigen + Freundanfrage bestätigen - The friend is already in your list. - Der Freund ist schon in Deiner Liste. + Der Freund ist schon in Deiner Liste. - The friend has been added to your list. - Der Freund wurde zu Deiner Liste hinzugefügt. + Der Freund wurde zu Deiner Liste hinzugefügt. - - Friend Request canceled - Freundanfrage abgebrochen + Freundanfrage abgebrochen - The friend could not be added to your list. - Der Freund konnte nicht zu Deiner Liste hinzugefügt werden. + Der Freund konnte nicht zu Deiner Liste hinzugefügt werden. - The friend could not be found. - Der Freund konnte nicht gefunden werden. + Der Freund konnte nicht gefunden werden. - - Forum Request canceled - Forumanfrage abgebrochen + Forumanfrage abgebrochen - The forum "%1" could not be found. - Das Forum "%1" konnte nicht gefunden werden. + Das Forum "%1" konnte nicht gefunden werden. - The forum message in forum "%1" could not be found. - Der Forumbeitrag im Forum "%1" konnte nicht gefunden werden. + Der Forumbeitrag im Forum "%1" konnte nicht gefunden werden. - The channel message in channel "%1" could not be found. - Der Kanalbeitrag im Kanal "%1" konnte nicht gefunden werden. + Der Kanalbeitrag im Kanal "%1" konnte nicht gefunden werden. - The receipient of the message is unknown. - Der Empfänger der Nachricht ist unbekannt. + Der Empfänger der Nachricht ist unbekannt. - + + Add file + Datei hinzufügen + + + + Add files + Dateien hinzufügen + + + + Add friend + Freund hinzufügen + + + + Add friends + Freunde hinzufügen + + + + Do you want to process the link ? + Möchtest du den Link verarbeiten ? + + + + Do you want to process %1 links ? + Möchtest du %1 Links verarbeiten ? + + + + Confirmation + Bestätigung + + + %1 of %2 RetroShare links processed. %1 von %2 RetroShare Links verarbeitet. - - Request Confirmation - Anfrage bestätigen + + %1 of %2 RetroShare link processed. + %1 von %2 RetroShare Link verarbeitet. - - - Channel Request canceled - Kanalanfrage abgebrochen - - - - The channel "%1" could not be found. - Der Kanal "%1" konnte nicht gefunden werden. - - - - Cannot send a message to a not accepted receipient "%1". - Nachricht kann nicht an den nicht akzeptierten Empfänger "%1" senden. + + File added + Datei hinzugefügt + Files added + Dateien hinzugefügt + + + + File exist + Datei vorhanden + + + + Files exist + Dateien vorhanden + + - Message Request canceled - Nachrichtenanfrage abgebrochen - - - - File Request Error - Fehler bei der Dateianforderung + Friend added + Freund hinzugefügt + Friends added + Freunde hinzugefügt + + + + Friend exist + Freund vorhanden + + + + Friends exist + Freunde vorhanden + + + + Friend not added + Freund nicht hinzugefügt + + + + Friends not added + Freunde nicht hinzugefügt + + + + Friend not found + Freund nicht gefunden + + + + Friends not found + Freunde nicht gefunden + + + + Forum not found + Forum nicht gefunden + + + + Forums not found + Foren nicht gefunden + + + + Forum message not found + Forumbeitrag nicht gefunden + + + + Forum messages not found + Forenbeiträge nicht gefunden + + + + Channel not found + Kanal nicht gefunden + + + + Channels not found + Kanäle nicht gefunden + + + + Channel message not found + Kanalbeitrag nicht gefunden + + + + Channel messages not found + Kanalbeiträge nicht gefunden + + + + Receipient not accepted + Empfänger nicht akzeptiert + + + + Receipients not accepted + Empfänger nicht akzeptiert + + + + Unkown receipient + Unbekannter Empfänger + + + + Unkown receipients + Unbekannte Empfänger + + + + Malformed links + Unbekannte Links + + + + Invalid links + Ungültige Links + + + + Result + Ergebnis + + + Request Confirmation + Anfrage bestätigen + + + Channel Request canceled + Kanalanfrage abgebrochen + + + The channel "%1" could not be found. + Der Kanal "%1" konnte nicht gefunden werden. + + + Cannot send a message to a not accepted receipient "%1". + Nachricht kann nicht an den nicht akzeptierten Empfänger "%1" senden. + + + Message Request canceled + Nachrichtenanfrage abgebrochen + + + File Request Error + Fehler bei der Dateianforderung + + The file link is malformed. - Link ist fehlerhaft. + Link ist fehlerhaft.