Added new RetroShare link format to write a message

retroshare://message?id=...[&subject=...]
Added clickable links in ForumMsgItem for the signer of the message to start the MessageComposer.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4190 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2011-05-07 23:14:09 +00:00
parent e34505c1d2
commit 70c3c9678d
11 changed files with 447 additions and 311 deletions

View File

@ -40,6 +40,7 @@
#include "common/PeerDefs.h" #include "common/PeerDefs.h"
#include "common/RSItemDelegate.h" #include "common/RSItemDelegate.h"
#include "common/Emoticons.h" #include "common/Emoticons.h"
#include "RetroShareLink.h"
#include <retroshare/rsinit.h> #include <retroshare/rsinit.h>
#include <retroshare/rspeers.h> #include <retroshare/rspeers.h>
@ -249,10 +250,6 @@ MessagesDialog::MessagesDialog(QWidget *parent)
connect(ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterColumnChanged())); connect(ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterColumnChanged()));
connect(ui.toText, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString)));
connect(ui.ccText, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString)));
connect(ui.bccText, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString)));
m_eListMode = LIST_NOTHING; m_eListMode = LIST_NOTHING;
mCurrCertId = ""; mCurrCertId = "";
@ -1671,13 +1668,14 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
/* iterate through the sources */ /* iterate through the sources */
std::list<std::string>::const_iterator pit; std::list<std::string>::const_iterator pit;
RetroShareLink link;
QString text; QString text;
QString name;
QString rsid;
for(pit = msgInfo.msgto.begin(); pit != msgInfo.msgto.end(); pit++) for(pit = msgInfo.msgto.begin(); pit != msgInfo.msgto.end(); pit++)
{ {
rsid = PeerDefs::rsidFromId(*pit, &name); if (link.createMessage(*pit, "")) {
text += "<a style='color: black;'href='" + rsid + "'> " + name + "</a>" + " "; text += link.toHtml() + " ";
}
} }
ui.toText->setText(text); ui.toText->setText(text);
@ -1688,8 +1686,9 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
text.clear(); text.clear();
for(pit = msgInfo.msgcc.begin(); pit != msgInfo.msgcc.end(); pit++) for(pit = msgInfo.msgcc.begin(); pit != msgInfo.msgcc.end(); pit++)
{ {
rsid = PeerDefs::rsidFromId(*pit, &name); if (link.createMessage(*pit, "")) {
text += "<a style='color: black;'href='" + rsid + "'> " + name + "</a>" + " "; text += link.toHtml() + " ";
}
} }
ui.ccText->setText(text); ui.ccText->setText(text);
} else { } else {
@ -1705,8 +1704,9 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
text.clear(); text.clear();
for(pit = msgInfo.msgbcc.begin(); pit != msgInfo.msgbcc.end(); pit++) for(pit = msgInfo.msgbcc.begin(); pit != msgInfo.msgbcc.end(); pit++)
{ {
rsid = PeerDefs::rsidFromId(*pit, &name); if (link.createMessage(*pit, "")) {
text += "<a style='color: black;'href='" + rsid + "'> " + name + "</a>" + " "; text += link.toHtml() + " ";
}
} }
ui.bccText->setText(text); ui.bccText->setText(text);
} else { } else {
@ -1722,18 +1722,17 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
ui.dateText-> setText(timestamp); ui.dateText-> setText(timestamp);
} }
std::string sSrcId; std::string srcId;
if ((msgInfo.msgflags & RS_MSG_BOXMASK) == RS_MSG_OUTBOX) { if ((msgInfo.msgflags & RS_MSG_BOXMASK) == RS_MSG_OUTBOX) {
// outgoing message are from me // outgoing message are from me
sSrcId = rsPeers->getOwnId(); srcId = rsPeers->getOwnId();
} else { } else {
sSrcId = msgInfo.srcId; srcId = msgInfo.srcId;
} }
rsid = PeerDefs::rsidFromId(sSrcId, &name); link.createMessage(srcId, "");
text += "<a style='color: black;'href='" + rsid + "'> " + name + "</a>" + " ";
ui.fromText->setText("<a style='color: blue;' href='" + rsid + "'> " + name +"</a>"); ui.fromText->setText(link.toHtml());
ui.fromText->setToolTip(rsid); ui.fromText->setToolTip(PeerDefs::rsidFromId(srcId));
ui.subjectText->setText(QString::fromStdWString(msgInfo.title)); ui.subjectText->setText(QString::fromStdWString(msgInfo.title));
@ -2262,18 +2261,6 @@ void MessagesDialog::tagTriggered(QAction *pAction)
// LockUpdate -> insertMessages(); // LockUpdate -> insertMessages();
} }
void MessagesDialog::linkActivated(QString link)
{
if (link.isEmpty() == false) {
std::string id = PeerDefs::idFromRsid(link, false);
RsPeerDetails detail;
if (rsPeers->getPeerDetails(id, detail) && detail.accept_connection) {
MessageComposer::msgFriend(detail.id, false);
}
}
}
void MessagesDialog::emptyTrash() void MessagesDialog::emptyTrash()
{ {
LockUpdate Lock (this, true); LockUpdate Lock (this, true);

View File

@ -57,7 +57,6 @@ public slots:
private slots: private slots:
/** Create the context popup menu and it's submenus */ /** Create the context popup menu and it's submenus */
void linkActivated(QString link);
void messageslistWidgetCostumPopupMenu( QPoint point ); void messageslistWidgetCostumPopupMenu( QPoint point );
void msgfilelistWidgetCostumPopupMenu(QPoint); void msgfilelistWidgetCostumPopupMenu(QPoint);
void folderlistWidgetCostumPopupMenu(QPoint); void folderlistWidgetCostumPopupMenu(QPoint);

View File

@ -1591,6 +1591,9 @@ p, li { white-space: pre-wrap; }
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
@ -1654,6 +1657,9 @@ p, li { white-space: pre-wrap; }
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
@ -1734,6 +1740,9 @@ p, li { white-space: pre-wrap; }
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="4" column="2" colspan="2"> <item row="4" column="2" colspan="2">
@ -1741,6 +1750,9 @@ p, li { white-space: pre-wrap; }
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">

View File

@ -33,6 +33,7 @@
#include "ForumsDialog.h" #include "ForumsDialog.h"
#include "ChannelFeed.h" #include "ChannelFeed.h"
#include "SearchDialog.h" #include "SearchDialog.h"
#include "msgs/MessageComposer.h"
#include "util/misc.h" #include "util/misc.h"
#include "common/PeerDefs.h" #include "common/PeerDefs.h"
@ -47,7 +48,8 @@
#define HOST_PERSON "person" #define HOST_PERSON "person"
#define HOST_FORUM "forum" #define HOST_FORUM "forum"
#define HOST_CHANNEL "channel" #define HOST_CHANNEL "channel"
#define HOST_REGEXP "file|person|forum|channel|search" #define HOST_MESSAGE "message"
#define HOST_REGEXP "file|person|forum|channel|search|message"
#define FILE_NAME "name" #define FILE_NAME "name"
#define FILE_SIZE "size" #define FILE_SIZE "size"
@ -64,6 +66,9 @@
#define CHANNEL_ID "id" #define CHANNEL_ID "id"
#define CHANNEL_MSGID "msgid" #define CHANNEL_MSGID "msgid"
#define MESSAGE_ID "id"
#define MESSAGE_SUBJECT "subject"
#define HOST_SEARCH "search" #define HOST_SEARCH "search"
#define SEARCH_KEYWORDS "keywords" #define SEARCH_KEYWORDS "keywords"
@ -194,6 +199,13 @@ void RetroShareLink::fromUrl(const QUrl& url)
return; return;
} }
if (url.host() == HOST_MESSAGE) {
_type = TYPE_MESSAGE;
std::string id = url.queryItemValue(MESSAGE_ID).toStdString();
createMessage(id, url.queryItemValue(MESSAGE_SUBJECT));
return;
}
// bad link // bad link
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
@ -280,6 +292,21 @@ bool RetroShareLink::createSearch(const QString& keywords)
return valid(); return valid();
} }
bool RetroShareLink::createMessage(const std::string& peerId, const QString& subject)
{
clear();
_hash = QString::fromStdString(peerId);
PeerDefs::rsidFromId(peerId, &_name);
_subject = subject;
_type = TYPE_MESSAGE;
check();
return valid();
}
void RetroShareLink::clear() void RetroShareLink::clear()
{ {
_valid = false; _valid = false;
@ -291,71 +318,74 @@ void RetroShareLink::clear()
void RetroShareLink::check() void RetroShareLink::check()
{ {
_valid = true; _valid = true;
switch (_type) { switch (_type) {
case TYPE_UNKNOWN: case TYPE_UNKNOWN:
_valid = false; _valid = false;
break; break;
case TYPE_FILE: case TYPE_FILE:
if(_size > (((uint64_t)1)<<40)) // 1TB. Who has such large files? if(_size > (((uint64_t)1)<<40)) // 1TB. Who has such large files?
_valid = false; _valid = false;
if(!checkName(_name)) if(!checkName(_name))
_valid = false; _valid = false;
if(!checkHash(_hash)) if(!checkHash(_hash))
_valid = false; _valid = false;
break; break;
case TYPE_PERSON: case TYPE_PERSON:
if(_size != 0) if(_size != 0)
_valid = false; _valid = false;
if(_name.isEmpty()) if(_name.isEmpty())
_valid = false; _valid = false;
if(_hash.isEmpty()) if(_hash.isEmpty())
_valid = false; _valid = false;
break; break;
case TYPE_FORUM: case TYPE_FORUM:
if(_size != 0) if(_size != 0)
_valid = false; _valid = false;
if(_name.isEmpty()) if(_name.isEmpty())
_valid = false; _valid = false;
if(_hash.isEmpty()) if(_hash.isEmpty())
_valid = false; _valid = false;
break; break;
case TYPE_CHANNEL: case TYPE_CHANNEL:
if(_size != 0) if(_size != 0)
_valid = false; _valid = false;
if(_name.isEmpty()) if(_name.isEmpty())
_valid = false; _valid = false;
if(_hash.isEmpty()) if(_hash.isEmpty())
_valid = false; _valid = false;
break; break;
case TYPE_SEARCH: case TYPE_SEARCH:
if(_size != 0) if(_size != 0)
_valid = false; _valid = false;
if(_name.isEmpty()) if(_name.isEmpty())
_valid = false; _valid = false;
if(!_hash.isEmpty()) if(!_hash.isEmpty())
_valid = false; _valid = false;
break; break;
} case TYPE_MESSAGE:
if(_size != 0)
_valid = false;
if(!_valid) // we should throw an exception instead of this crap, but drbob doesn't like exceptions. Why ??? if(_hash.isEmpty())
{ _valid = false;
_type = TYPE_UNKNOWN; break;
_hash = "" ; }
_name = "" ;
_size = 0 ; if (!_valid) {
} clear();
}
} }
QString RetroShareLink::title() const QString RetroShareLink::title() const
@ -374,6 +404,8 @@ QString RetroShareLink::title() const
case TYPE_CHANNEL: case TYPE_CHANNEL:
case TYPE_SEARCH: case TYPE_SEARCH:
break; break;
case TYPE_MESSAGE:
return PeerDefs::rsidFromId(hash().toStdString());
} }
return ""; return "";
@ -458,6 +490,22 @@ QString RetroShareLink::toString(bool encoded /*= true*/) const
return url.toEncoded(); return url.toEncoded();
} }
return url.toString();
}
case TYPE_MESSAGE:
{
QUrl url;
url.setScheme(RSLINK_SCHEME);
url.setHost(HOST_MESSAGE);
url.addQueryItem(MESSAGE_ID, _hash);
if (_subject.isEmpty() == false) {
url.addQueryItem(MESSAGE_SUBJECT, _subject);
}
if (encoded) {
return url.toEncoded();
}
return url.toString(); return url.toString();
} }
} }
@ -545,198 +593,232 @@ bool RetroShareLink::checkHash(const QString& hash)
bool RetroShareLink::process(int flag) bool RetroShareLink::process(int flag)
{ {
if (valid() == false) { if (valid() == false) {
std::cerr << " RetroShareLink::process invalid request" << std::endl; std::cerr << " RetroShareLink::process invalid request" << std::endl;
return false; return false;
} }
switch (type()) { switch (type()) {
case TYPE_UNKNOWN: case TYPE_UNKNOWN:
break; break;
case TYPE_FILE: case TYPE_FILE:
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process FileRequest : fileName : " << name().toUtf8().constData() << ". fileHash : " << hash().toStdString() << ". fileSize : " << size() << std::endl; std::cerr << " RetroShareLink::process FileRequest : fileName : " << name().toUtf8().constData() << ". fileHash : " << hash().toStdString() << ". fileSize : " << size() << std::endl;
#endif #endif
// Get a list of available direct sources, in case the file is browsable only. // Get a list of available direct sources, in case the file is browsable only.
std::list<std::string> srcIds; std::list<std::string> srcIds;
FileInfo finfo ; FileInfo finfo ;
rsFiles->FileDetails(hash().toStdString(), RS_FILE_HINTS_REMOTE,finfo) ; rsFiles->FileDetails(hash().toStdString(), RS_FILE_HINTS_REMOTE,finfo) ;
for(std::list<TransferInfo>::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) for(std::list<TransferInfo>::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it)
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " adding peerid " << (*it).peerId << std::endl ; std::cerr << " adding peerid " << (*it).peerId << std::endl ;
#endif #endif
srcIds.push_back((*it).peerId) ; srcIds.push_back((*it).peerId) ;
} }
if (rsFiles->FileRequest(name().toUtf8().constData(), hash().toStdString(), size(), "", RS_FILE_HINTS_NETWORK_WIDE, srcIds)) { if (rsFiles->FileRequest(name().toUtf8().constData(), hash().toStdString(), size(), "", RS_FILE_HINTS_NETWORK_WIDE, srcIds)) {
if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return true; return true;
} }
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
case TYPE_PERSON: case TYPE_PERSON:
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process FriendRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << std::endl; std::cerr << " RetroShareLink::process FriendRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << std::endl;
#endif #endif
RsPeerDetails detail; RsPeerDetails detail;
if (rsPeers->getPeerDetails(hash().toStdString(), detail)) { if (rsPeers->getPeerDetails(hash().toStdString(), detail)) {
if (detail.gpg_id == rsPeers->getGPGOwnId()) { if (detail.gpg_id == rsPeers->getGPGOwnId()) {
// it's me, do nothing // it's me, do nothing
return true; return true;
} }
if (detail.accept_connection) { if (detail.accept_connection) {
// peer connection is already accepted // peer connection is already accepted
if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return true; return true;
} }
if (rsPeers->setAcceptToConnectGPGCertificate(hash().toStdString(), true)) { if (rsPeers->setAcceptToConnectGPGCertificate(hash().toStdString(), true)) {
if (flag & RSLINK_PROCESS_NOTIFY_SUCCESS) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return true; return true;
} }
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
case TYPE_FORUM: case TYPE_FORUM:
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process ForumRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl; std::cerr << " RetroShareLink::process ForumRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl;
#endif #endif
ForumInfo fi; ForumInfo fi;
if (!rsForums->getForumInfo(id().toStdString(), fi)) { if (!rsForums->getForumInfo(id().toStdString(), fi)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
ForumMsgInfo msg; ForumMsgInfo msg;
if (!msgId().isEmpty()) { if (!msgId().isEmpty()) {
if (!rsForums->getForumMessage(fi.forumId, msgId().toStdString(), msg)) { if (!rsForums->getForumMessage(fi.forumId, msgId().toStdString(), msg)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
} }
MainWindow::showWindow(MainWindow::Forums); MainWindow::showWindow(MainWindow::Forums);
ForumsDialog *forumsDialog = dynamic_cast<ForumsDialog*>(MainWindow::getPage(MainWindow::Forums)); ForumsDialog *forumsDialog = dynamic_cast<ForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
if (!forumsDialog) { if (!forumsDialog) {
return false; return false;
} }
return forumsDialog->navigate(fi.forumId, msg.msgId); return forumsDialog->navigate(fi.forumId, msg.msgId);
} }
case TYPE_CHANNEL: case TYPE_CHANNEL:
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process ChannelRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl; std::cerr << " RetroShareLink::process ChannelRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl;
#endif #endif
ChannelInfo ci; ChannelInfo ci;
if (!rsChannels->getChannelInfo(id().toStdString(), ci)) { if (!rsChannels->getChannelInfo(id().toStdString(), ci)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
ChannelMsgInfo msg; ChannelMsgInfo msg;
if (!msgId().isEmpty()) { if (!msgId().isEmpty()) {
if (!rsChannels->getChannelMessage(ci.channelId, msgId().toStdString(), msg)) { if (!rsChannels->getChannelMessage(ci.channelId, msgId().toStdString(), msg)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { 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); 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.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec(); mb.exec();
} }
return false; return false;
} }
} }
MainWindow::showWindow(MainWindow::Channels); MainWindow::showWindow(MainWindow::Channels);
ChannelFeed *channelFeed = dynamic_cast<ChannelFeed*>(MainWindow::getPage(MainWindow::Channels)); ChannelFeed *channelFeed = dynamic_cast<ChannelFeed*>(MainWindow::getPage(MainWindow::Channels));
if (!channelFeed) { if (!channelFeed) {
return false; return false;
} }
return channelFeed->navigate(ci.channelId, msg.msgId); return channelFeed->navigate(ci.channelId, msg.msgId);
} }
case TYPE_SEARCH: case TYPE_SEARCH:
{ {
#ifdef DEBUG_RSLINK #ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process SearchRequest : string : " << name().toStdString() << std::endl; std::cerr << " RetroShareLink::process SearchRequest : string : " << name().toStdString() << std::endl;
#endif #endif
MainWindow::showWindow(MainWindow::Search); MainWindow::showWindow(MainWindow::Search);
SearchDialog *searchDialog = dynamic_cast<SearchDialog*>(MainWindow::getPage(MainWindow::Search)); SearchDialog *searchDialog = dynamic_cast<SearchDialog*>(MainWindow::getPage(MainWindow::Search));
if (!searchDialog) { if (!searchDialog) {
return false; return false;
} }
searchDialog->searchKeywords(name()); searchDialog->searchKeywords(name());
return true; return true;
} }
}
std::cerr << " RetroShareLink::process unknown type: " << type() << std::endl; 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()) {
MessageComposer *msg = MessageComposer::newMsg();
msg->addRecipient(MessageComposer::TO, detail.id, false);
if (subject().isEmpty() == false) {
msg->insertTitleText(subject());
}
msg->show();
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) { return true;
QMessageBox mb(QObject::tr("File Request Error"), QObject::tr("The file link is malformed."),QMessageBox::Critical,QMessageBox::Ok,0,0); } else {
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); if (flag & RSLINK_PROCESS_NOTIFY_ERROR) {
mb.exec(); 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")));
return false; 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();
}
}
return false;
}
}
std::cerr << " RetroShareLink::process unknown type: " << type() << std::endl;
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);
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec();
}
return false;
} }
void RSLinkClipboard::copyLinks(const std::vector<RetroShareLink>& links) void RSLinkClipboard::copyLinks(const std::vector<RetroShareLink>& links)

View File

@ -47,7 +47,7 @@
class RetroShareLink class RetroShareLink
{ {
public: public:
enum enumType { TYPE_UNKNOWN, TYPE_FILE, TYPE_PERSON, TYPE_FORUM, TYPE_CHANNEL, TYPE_SEARCH }; enum enumType { TYPE_UNKNOWN, TYPE_FILE, TYPE_PERSON, TYPE_FORUM, TYPE_CHANNEL, TYPE_SEARCH, TYPE_MESSAGE };
public: public:
RetroShareLink(); RetroShareLink();
@ -59,6 +59,7 @@ class RetroShareLink
bool createForum(const QString& name, const QString& id, const QString& msgId); bool createForum(const QString& name, const QString& id, const QString& msgId);
bool createChannel(const QString& name, const QString& id, const QString& msgId); bool createChannel(const QString& name, const QString& id, const QString& msgId);
bool createSearch(const QString& keywords); bool createSearch(const QString& keywords);
bool createMessage(const std::string& peerId, const QString& subject);
enumType type() const {return _type; } enumType type() const {return _type; }
uint64_t size() const { return _size ; } uint64_t size() const { return _size ; }
@ -66,6 +67,7 @@ class RetroShareLink
const QString& hash() const { return _hash ; } const QString& hash() const { return _hash ; }
const QString& id() const { return _hash ; } const QString& id() const { return _hash ; }
const QString& msgId() const { return _msgId ; } const QString& msgId() const { return _msgId ; }
const QString& subject() const { return _subject ; }
QString title() const; QString title() const;
// get nice name for anchor // get nice name for anchor
@ -103,8 +105,9 @@ class RetroShareLink
enumType _type; enumType _type;
QString _name; QString _name;
uint64_t _size; uint64_t _size;
QString _hash; // or id (forum, channel) QString _hash; // or id (forum, channel, message)
QString _msgId; // id of the message (forum, channel) QString _msgId; // id of the message (forum, channel)
QString _subject;
}; };
/// This class handles the copy/paste of links. Every member is static to ensure unicity. /// This class handles the copy/paste of links. Every member is static to ensure unicity.

View File

@ -26,9 +26,9 @@
const QString PeerDefs::nameWithLocation(const RsPeerDetails &details) const QString PeerDefs::nameWithLocation(const RsPeerDetails &details)
{ {
QString name = QString::fromStdString(details.name); QString name = QString::fromUtf8(details.name.c_str());
if (details.location.empty() == false) { if (details.location.empty() == false) {
name += " (" + QString::fromStdString(details.location) + ")"; name += " (" + QString::fromUtf8(details.location.c_str()) + ")";
} }
return name; return name;
@ -40,7 +40,7 @@ const QString PeerDefs::rsid(const std::string &name, const std::string &id)
return qApp->translate("PeerDefs", "Unknown") + "@" + QString::fromStdString(id); return qApp->translate("PeerDefs", "Unknown") + "@" + QString::fromStdString(id);
} }
return QString::fromStdString(name) + "@" + QString::fromStdString(id); return QString::fromUtf8(name.c_str()) + "@" + QString::fromStdString(id);
} }
const QString PeerDefs::rsid(const RsPeerDetails &details) const QString PeerDefs::rsid(const RsPeerDetails &details)
@ -63,7 +63,7 @@ const QString PeerDefs::rsidFromId(const std::string &id, QString *name /*= NULL
rsid = PeerDefs::rsid(peerName, id); rsid = PeerDefs::rsid(peerName, id);
if (name) { if (name) {
*name = QString::fromStdString(peerName); *name = QString::fromUtf8(peerName.c_str());
} }
} }

View File

@ -58,7 +58,7 @@ ForumMsgItem::ForumMsgItem(FeedHolder *parent, uint32_t feedId, const std::strin
connect( unsubscribeButton, SIGNAL( clicked( void ) ), this, SLOT( unsubscribeForum ( void ) ) ); connect( unsubscribeButton, SIGNAL( clicked( void ) ), this, SLOT( unsubscribeForum ( void ) ) );
connect( replyButton, SIGNAL( clicked( void ) ), this, SLOT( replyToPost ( void ) ) ); connect( replyButton, SIGNAL( clicked( void ) ), this, SLOT( replyToPost ( void ) ) );
connect( sendButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) ); connect( sendButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) );
connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&)));
small(); small();
@ -144,7 +144,9 @@ void ForumMsgItem::updateItemStatic()
if (rsPeers->getPeerName(msg.srcId) !="") if (rsPeers->getPeerName(msg.srcId) !="")
{ {
namelabel->setText(QString::fromStdString(rsPeers->getPeerName(msg.srcId))); RetroShareLink linkMessage;
linkMessage.createMessage(msg.srcId, "");
namelabel->setText(linkMessage.toHtml());
} }
else else
{ {
@ -157,7 +159,7 @@ void ForumMsgItem::updateItemStatic()
QDateTime qtime; QDateTime qtime;
qtime.setTime_t(msg.ts); qtime.setTime_t(msg.ts);
QString timestamp = qtime.toString("dd.MM.yyyy hh:mm:ss"); QString timestamp = qtime.toString("dd.MM.yyyy hh:mm:ss");
timestamplabel->setText(timestamp); timestamplabel->setText(timestamp);
nextFrame->hide(); nextFrame->hide();
} }
@ -167,7 +169,9 @@ void ForumMsgItem::updateItemStatic()
if (rsPeers->getPeerName(msg.srcId) !="") if (rsPeers->getPeerName(msg.srcId) !="")
{ {
nextnamelabel->setText(QString::fromStdString(rsPeers->getPeerName(msg.srcId))); RetroShareLink linkMessage;
linkMessage.createMessage(msg.srcId, "");
nextnamelabel->setText(linkMessage.toHtml());
} }
else else
{ {
@ -196,7 +200,9 @@ void ForumMsgItem::updateItemStatic()
if (rsPeers->getPeerName(msgParent.srcId) !="") if (rsPeers->getPeerName(msgParent.srcId) !="")
{ {
namelabel->setText(QString::fromStdString(rsPeers->getPeerName(msgParent.srcId))); RetroShareLink linkMessage;
linkMessage.createMessage(msgParent.srcId, "");
namelabel->setText(linkMessage.toHtml());
} }
else else
{ {

View File

@ -358,6 +358,9 @@ border-radius: 10px}</string>
<property name="text"> <property name="text">
<string notr="true">Friend Name</string> <string notr="true">Friend Name</string>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="1" rowspan="2"> <item row="1" column="1" rowspan="2">
@ -522,6 +525,9 @@ border-radius: 10px}</string>
<property name="text"> <property name="text">
<string notr="true">Next Name</string> <string notr="true">Next Name</string>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="1" column="2">

View File

@ -1509,31 +1509,52 @@ void MessageComposer::editingRecipientFinished()
void MessageComposer::addRecipient(enumType type, const std::string &id, bool group) void MessageComposer::addRecipient(enumType type, const std::string &id, bool group)
{ {
// search existing or empty row std::list<std::string> sslIds;
int rowCount = ui.recipientWidget->rowCount(); if (group) {
int row; sslIds.push_back(id);
for (row = 0; row < rowCount; row++) { } else {
enumType rowType; // check for gpg id or ssl id
std::string rowId; RsPeerDetails detail;
bool rowGroup; if (!rsPeers->getPeerDetails(id, detail)) {
return;
}
if (getRecipientFromRow(row, rowType, rowId, rowGroup) == true) { if (detail.isOnlyGPGdetail) {
if (rowId.empty()) { if (!rsPeers->getSSLChildListOfGPGId(id, sslIds)) {
return;
}
} else {
sslIds.push_back(id);
}
}
std::list<std::string>::const_iterator sslIt;
for (sslIt = sslIds.begin(); sslIt != sslIds.end(); sslIt++) {
// search existing or empty row
int rowCount = ui.recipientWidget->rowCount();
int row;
for (row = 0; row < rowCount; row++) {
enumType rowType;
std::string rowId;
bool rowGroup;
if (getRecipientFromRow(row, rowType, rowId, rowGroup) == true) {
if (rowId.empty()) {
// use row
break;
}
if (rowId == *sslIt && rowType == type && group == rowGroup) {
// existing row
break;
}
} else {
// use row // use row
break; break;
} }
if (rowId == id && rowType == type && group == rowGroup) {
// existing row
break;
}
} else {
// use row
break;
} }
}
setRecipientToRow(row, type, id, group); setRecipientToRow(row, type, *sslIt, group);
}
} }
void MessageComposer::setupFileActions() void MessageComposer::setupFileActions()

View File

@ -3562,8 +3562,8 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location line="+57"/> <location line="+57"/>
<location line="+179"/> <location line="+182"/>
<location line="+164"/> <location line="+167"/>
<source>Subject: </source> <source>Subject: </source>
<translation>Betreff:</translation> <translation>Betreff:</translation>
</message> </message>
@ -3572,7 +3572,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Gehe zum Forumbeitrag</translation> <translation type="obsolete">Gehe zum Forumbeitrag</translation>
</message> </message>
<message> <message>
<location line="-281"/> <location line="-287"/>
<source>Unsubscribe To Forum</source> <source>Unsubscribe To Forum</source>
<translation>Forum abbestellen</translation> <translation>Forum abbestellen</translation>
</message> </message>
@ -3582,7 +3582,7 @@ p, li { white-space: pre-wrap; }
<translation>Antwort</translation> <translation>Antwort</translation>
</message> </message>
<message> <message>
<location line="+337"/> <location line="+343"/>
<source>Send</source> <source>Send</source>
<translation>Senden</translation> <translation>Senden</translation>
</message> </message>
@ -3602,19 +3602,19 @@ p, li { white-space: pre-wrap; }
<translation>Unbekannter Forumbeitrag</translation> <translation>Unbekannter Forumbeitrag</translation>
</message> </message>
<message> <message>
<location line="+35"/> <location line="+37"/>
<location line="+23"/> <location line="+25"/>
<location line="+29"/> <location line="+31"/>
<source>Anonymous</source> <source>Anonymous</source>
<translation>Anonym</translation> <translation>Anonym</translation>
</message> </message>
<message> <message>
<location line="-18"/> <location line="-20"/>
<source>In Reply to</source> <source>In Reply to</source>
<translation>Als Antwort auf</translation> <translation>Als Antwort auf</translation>
</message> </message>
<message> <message>
<location line="+166"/> <location line="+168"/>
<source>Please give a Text Message</source> <source>Please give a Text Message</source>
<translation>Bitte Nachricht eingeben</translation> <translation>Bitte Nachricht eingeben</translation>
</message> </message>
@ -5881,12 +5881,12 @@ Bitte gib etwas Speicher frei und drücke OK.</translation>
</message> </message>
<message> <message>
<location line="+213"/> <location line="+213"/>
<location line="+1584"/> <location line="+1605"/>
<source>Save Message</source> <source>Save Message</source>
<translation>Nachricht speichern</translation> <translation>Nachricht speichern</translation>
</message> </message>
<message> <message>
<location line="-1583"/> <location line="-1604"/>
<source>Message has not been Sent. <source>Message has not been Sent.
Do you want to save message to draft box?</source> Do you want to save message to draft box?</source>
<translation>Nachricht wurde noch nicht gesendet. <translation>Nachricht wurde noch nicht gesendet.
@ -5935,7 +5935,7 @@ Möchtest Du die Nachricht in den Entwürfen speichern?</translation>
<translation>Unbekannter Freund</translation> <translation>Unbekannter Freund</translation>
</message> </message>
<message> <message>
<location line="+165"/> <location line="+186"/>
<source>&amp;File</source> <source>&amp;File</source>
<translation>&amp;Datei</translation> <translation>&amp;Datei</translation>
</message> </message>
@ -6104,7 +6104,7 @@ Willst Du die Nachricht speichern ?</translation>
<translation>Datei nicht gefunden oder Dateiname nicht akzeptiert.</translation> <translation>Datei nicht gefunden oder Dateiname nicht akzeptiert.</translation>
</message> </message>
<message> <message>
<location line="-2022"/> <location line="-2043"/>
<source>Friend Recommendation(s)</source> <source>Friend Recommendation(s)</source>
<translation>Freundempfehlung(en)</translation> <translation>Freundempfehlung(en)</translation>
</message> </message>
@ -6189,7 +6189,7 @@ Willst Du die Nachricht speichern ?</translation>
<name>MessagesDialog</name> <name>MessagesDialog</name>
<message> <message>
<location filename="../gui/MessagesDialog.ui" line="+576"/> <location filename="../gui/MessagesDialog.ui" line="+576"/>
<location filename="../gui/MessagesDialog.cpp" line="+687"/> <location filename="../gui/MessagesDialog.cpp" line="+684"/>
<source>New Message</source> <source>New Message</source>
<translation>Neue Nachricht</translation> <translation>Neue Nachricht</translation>
</message> </message>
@ -6217,12 +6217,12 @@ Willst Du die Nachricht speichern ?</translation>
<translation>Von</translation> <translation>Von</translation>
</message> </message>
<message> <message>
<location line="+837"/> <location line="+849"/>
<source>Size</source> <source>Size</source>
<translation>Grösse</translation> <translation>Grösse</translation>
</message> </message>
<message> <message>
<location line="-440"/> <location line="-452"/>
<source>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; <source>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Arial&apos;; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Arial&apos;; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
@ -6297,15 +6297,15 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location line="+180"/> <location line="+180"/>
<location filename="../gui/MessagesDialog.cpp" line="-44"/> <location filename="../gui/MessagesDialog.cpp" line="-44"/>
<location line="+984"/> <location line="+986"/>
<location line="+10"/> <location line="+10"/>
<source>Inbox</source> <source>Inbox</source>
<translation>Posteingang</translation> <translation>Posteingang</translation>
</message> </message>
<message> <message>
<location line="+9"/> <location line="+9"/>
<location filename="../gui/MessagesDialog.cpp" line="-989"/> <location filename="../gui/MessagesDialog.cpp" line="-991"/>
<location line="+1002"/> <location line="+1004"/>
<location line="+8"/> <location line="+8"/>
<source>Outbox</source> <source>Outbox</source>
<translation>Postausgang</translation> <translation>Postausgang</translation>
@ -6317,12 +6317,12 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location line="+9"/> <location line="+9"/>
<location filename="../gui/MessagesDialog.cpp" line="-1000"/> <location filename="../gui/MessagesDialog.cpp" line="-1002"/>
<source>Sent</source> <source>Sent</source>
<translation>Gesendet</translation> <translation>Gesendet</translation>
</message> </message>
<message> <message>
<location line="+526"/> <location line="+532"/>
<source>Cc:</source> <source>Cc:</source>
<translation>Cc:</translation> <translation>Cc:</translation>
</message> </message>
@ -6332,7 +6332,7 @@ p, li { white-space: pre-wrap; }
<translation>Bcc:</translation> <translation>Bcc:</translation>
</message> </message>
<message> <message>
<location line="+37"/> <location line="+43"/>
<source>Tags:</source> <source>Tags:</source>
<translation>Schlagwörter:</translation> <translation>Schlagwörter:</translation>
</message> </message>
@ -6379,13 +6379,13 @@ p, li { white-space: pre-wrap; }
<translation>Speichern unter...</translation> <translation>Speichern unter...</translation>
</message> </message>
<message> <message>
<location filename="../gui/MessagesDialog.cpp" line="+756"/> <location filename="../gui/MessagesDialog.cpp" line="+758"/>
<source>Print Document</source> <source>Print Document</source>
<translation>Dokument drucken</translation> <translation>Dokument drucken</translation>
</message> </message>
<message> <message>
<location filename="../gui/MessagesDialog.ui" line="-898"/> <location filename="../gui/MessagesDialog.ui" line="-910"/>
<location filename="../gui/MessagesDialog.cpp" line="-1583"/> <location filename="../gui/MessagesDialog.cpp" line="-1585"/>
<source>Subject</source> <source>Subject</source>
<translation>Betreff</translation> <translation>Betreff</translation>
</message> </message>
@ -6400,12 +6400,12 @@ p, li { white-space: pre-wrap; }
<translation>Von:</translation> <translation>Von:</translation>
</message> </message>
<message> <message>
<location line="+65"/> <location line="+68"/>
<source>To:</source> <source>To:</source>
<translation>An:</translation> <translation>An:</translation>
</message> </message>
<message> <message>
<location line="+172"/> <location line="+181"/>
<source>File Name</source> <source>File Name</source>
<translation>Dateiname</translation> <translation>Dateiname</translation>
</message> </message>
@ -6415,7 +6415,7 @@ p, li { white-space: pre-wrap; }
<translation>Prüfsumme</translation> <translation>Prüfsumme</translation>
</message> </message>
<message> <message>
<location line="-987"/> <location line="-999"/>
<source>Print</source> <source>Print</source>
<translation>Drucken</translation> <translation>Drucken</translation>
</message> </message>
@ -6450,7 +6450,7 @@ p, li { white-space: pre-wrap; }
<translation>Empfohlene Dateien einblenden</translation> <translation>Empfohlene Dateien einblenden</translation>
</message> </message>
<message> <message>
<location line="+892"/> <location line="+894"/>
<source>File</source> <source>File</source>
<translation>Datei</translation> <translation>Datei</translation>
</message> </message>
@ -6470,7 +6470,7 @@ p, li { white-space: pre-wrap; }
<translation>HTML-Dateien (*.htm *.html);;Alle Dateien (*)</translation> <translation>HTML-Dateien (*.htm *.html);;Alle Dateien (*)</translation>
</message> </message>
<message> <message>
<location line="-1560"/> <location line="-1562"/>
<location line="+294"/> <location line="+294"/>
<source>Reply to All</source> <source>Reply to All</source>
<translation>Allen antworten</translation> <translation>Allen antworten</translation>
@ -6510,7 +6510,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location line="+177"/> <location line="+177"/>
<location filename="../gui/MessagesDialog.cpp" line="+628"/> <location filename="../gui/MessagesDialog.cpp" line="+628"/>
<location line="+1026"/> <location line="+1028"/>
<location line="+5"/> <location line="+5"/>
<source>Trash</source> <source>Trash</source>
<translation>Papierkorb</translation> <translation>Papierkorb</translation>
@ -6526,7 +6526,7 @@ p, li { white-space: pre-wrap; }
<translation>Ordner</translation> <translation>Ordner</translation>
</message> </message>
<message> <message>
<location filename="../gui/MessagesDialog.cpp" line="-1648"/> <location filename="../gui/MessagesDialog.cpp" line="-1650"/>
<source>Remove All Tags</source> <source>Remove All Tags</source>
<translation>Alle Schlagwörter entfernen</translation> <translation>Alle Schlagwörter entfernen</translation>
</message> </message>
@ -6557,13 +6557,13 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location line="+358"/> <location line="+358"/>
<location line="+1017"/> <location line="+1019"/>
<location line="+8"/> <location line="+8"/>
<source>Drafts</source> <source>Drafts</source>
<translation>Entwürfe</translation> <translation>Entwürfe</translation>
</message> </message>
<message> <message>
<location line="-989"/> <location line="-991"/>
<source>To</source> <source>To</source>
<translation>An</translation> <translation>An</translation>
</message> </message>
@ -6573,7 +6573,7 @@ p, li { white-space: pre-wrap; }
<translation>Editieren...</translation> <translation>Editieren...</translation>
</message> </message>
<message> <message>
<location line="+1404"/> <location line="+1406"/>
<location line="+4"/> <location line="+4"/>
<location line="+4"/> <location line="+4"/>
<location line="+4"/> <location line="+4"/>
@ -8958,7 +8958,7 @@ Lockdatei:
<translation>Vielleicht ist das Passwort falsch</translation> <translation>Vielleicht ist das Passwort falsch</translation>
</message> </message>
<message> <message>
<location filename="../gui/RetroShareLink.cpp" line="+578"/> <location filename="../gui/RetroShareLink.cpp" line="+626"/>
<source>File Request Confirmation</source> <source>File Request Confirmation</source>
<translation>Bestätigung der Dateianforderung</translation> <translation>Bestätigung der Dateianforderung</translation>
</message> </message>
@ -8968,7 +8968,7 @@ Lockdatei:
<translation>Die Datei wurde zur Downloadliste hinzugefügt.</translation> <translation>Die Datei wurde zur Downloadliste hinzugefügt.</translation>
</message> </message>
<message> <message>
<location filename="../gui/MessagesDialog.cpp" line="-1144"/> <location filename="../gui/MessagesDialog.cpp" line="-1146"/>
<location filename="../gui/RetroShareLink.cpp" line="+8"/> <location filename="../gui/RetroShareLink.cpp" line="+8"/>
<source>File Request canceled</source> <source>File Request canceled</source>
<translation>Dateianforderung abgebrochen</translation> <translation>Dateianforderung abgebrochen</translation>
@ -9038,12 +9038,17 @@ Lockdatei:
<source>The channel message in channel &quot;%1&quot; could not be found.</source> <source>The channel message in channel &quot;%1&quot; could not be found.</source>
<translation>Der Kanalbeitrag im Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation> <translation>Der Kanalbeitrag im Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message> </message>
<message>
<location line="+58"/>
<source>The receipient of the message is unknown.</source>
<translation>Der Empfänger der Nachricht ist unbekannt.</translation>
</message>
<message> <message>
<source>The forum message could not be found.</source> <source>The forum message could not be found.</source>
<translation type="obsolete">Der Forumbeitrag &quot;%1&quot; konnte nicht gefunden werden.</translation> <translation type="obsolete">Der Forumbeitrag &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message> </message>
<message> <message>
<location line="-11"/> <location line="-69"/>
<location line="+11"/> <location line="+11"/>
<source>Channel Request canceled</source> <source>Channel Request canceled</source>
<translation>Kanalanfrage abgebrochen</translation> <translation>Kanalanfrage abgebrochen</translation>
@ -9054,7 +9059,22 @@ Lockdatei:
<translation>Der Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation> <translation>Der Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message> </message>
<message> <message>
<location line="+48"/> <location line="+62"/>
<source>Cannot send a message to a not accepted receipient &quot;%1&quot;.</source>
<translation>Nachricht kann nicht an den nicht akzeptierten Empfänger &quot;%1&quot; senden.</translation>
</message>
<message>
<location line="+0"/>
<location line="+7"/>
<source>Message Request canceled</source>
<translation>Nachrichtenanfrage abgebrochen</translation>
</message>
<message>
<source>The receipient of the message &quot;%1&quot; is unknown.</source>
<translation type="obsolete">Der Empfänger der Nachricht &quot;%1&quot; ist unbekannt.</translation>
</message>
<message>
<location line="+13"/>
<source>File Request Error</source> <source>File Request Error</source>
<translation>Fehler bei der Dateianforderung</translation> <translation>Fehler bei der Dateianforderung</translation>
</message> </message>
@ -9671,12 +9691,12 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location line="+319"/> <location line="+319"/>
<location filename="../gui/SearchDialog.cpp" line="+281"/> <location filename="../gui/SearchDialog.cpp" line="+287"/>
<source>Download</source> <source>Download</source>
<translation>Herunterladen</translation> <translation>Herunterladen</translation>
</message> </message>
<message> <message>
<location filename="../gui/SearchDialog.cpp" line="-178"/> <location filename="../gui/SearchDialog.cpp" line="-183"/>
<source>Enter a keyword here (at least 3 char long)</source> <source>Enter a keyword here (at least 3 char long)</source>
<translation>Gib einen Suchbegriff ein (min. 3 Zeichen)</translation> <translation>Gib einen Suchbegriff ein (min. 3 Zeichen)</translation>
</message> </message>
@ -9697,7 +9717,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Freunden empfehlen</translation> <translation type="obsolete">Freunden empfehlen</translation>
</message> </message>
<message> <message>
<location line="+180"/> <location line="+185"/>
<location line="+139"/> <location line="+139"/>
<source>Copy RetroShare Link</source> <source>Copy RetroShare Link</source>
<translation>Kopiere RetroShare Link</translation> <translation>Kopiere RetroShare Link</translation>