patch 003 from rudiger

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-Mime@7414 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2014-06-28 14:08:24 +00:00
parent 42c286c831
commit 287d1a9679
17 changed files with 386 additions and 308 deletions

View File

@ -95,7 +95,6 @@ typedef std::string ChatLobbyNickName ;
typedef RsPeerId DistantChatPeerId ;
typedef GRouterKeyIdType DistantMsgPeerId ;
typedef uint64_t MessageId ;
class MsgAddress
{
@ -139,8 +138,11 @@ class MsgAddress
class MessageInfo : public mimetic::MimeEntity
{
MessageInfo( const MessageInfo & );
public:
MessageInfo() {}
typedef std::string MimeMsgId;
MessageInfo();
MessageInfo( const std::string & msg ){ setMessage( msg ); }
class addr_iterator {
@ -172,6 +174,9 @@ public:
const std::string toString() const;
void addAddr( const MsgAddress & addr );
RsMessageId getMessageId();
RsPeerId rspeerid_srcId;
RsGxsId rsgxsid_srcId;
@ -185,7 +190,7 @@ class MsgInfoSummary
public:
MsgInfoSummary() {}
std::string msgId;
RsMessageId msgId;
RsPeerId srcId;
uint32_t msgflags;
@ -200,7 +205,7 @@ class MsgTagInfo
public:
MsgTagInfo() {}
std::string msgId;
RsMessageId msgId;
std::list<uint32_t> tagIds;
};
@ -322,22 +327,22 @@ virtual ~RsMsgs() { return; }
/****************************************/
virtual bool getMessageSummaries(std::list<MsgInfoSummary> &msgList) = 0;
virtual bool getMessage(const std::string &mId, MessageInfo &msg) = 0;
virtual bool getMessage(const RsMessageId &mId, MessageInfo &msg) = 0;
virtual void getMessageCount(unsigned int *pnInbox, unsigned int *pnInboxNew, unsigned int *pnOutbox, unsigned int *pnDraftbox, unsigned int *pnSentbox, unsigned int *pnTrashbox) = 0;
virtual bool decryptMessage(const std::string& mId) = 0 ;
virtual bool decryptMessage(const RsMessageId& mId) = 0 ;
virtual bool MessageSend(MessageInfo &info) = 0;
virtual bool SystemMessage(const std::string &title, const std::string &message, uint32_t systemFlag) = 0;
virtual bool MessageToDraft(MessageInfo &info, const std::string &msgParentId) = 0;
virtual bool MessageToTrash(const std::string &mid, bool bTrash) = 0;
virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId) = 0;
virtual bool MessageToDraft(MessageInfo &info, const RsMessageId &msgParentId) = 0;
virtual bool MessageToTrash(const RsMessageId &mid, bool bTrash) = 0;
virtual bool getMsgParentId(const RsMessageId &msgId, RsMessageId &msgParentId) = 0;
virtual bool MessageDelete(const std::string &mid) = 0;
virtual bool MessageRead(const std::string &mid, bool unreadByUser) = 0;
virtual bool MessageReplied(const std::string &mid, bool replied) = 0;
virtual bool MessageForwarded(const std::string &mid, bool forwarded) = 0;
virtual bool MessageStar(const std::string &mid, bool mark) = 0;
virtual bool MessageLoadEmbeddedImages(const std::string &mid, bool load) = 0;
virtual bool MessageDelete(const RsMessageId &mid) = 0;
virtual bool MessageRead(const RsMessageId &mid, bool unreadByUser) = 0;
virtual bool MessageReplied(const RsMessageId &mid, bool replied) = 0;
virtual bool MessageForwarded(const RsMessageId &mid, bool forwarded) = 0;
virtual bool MessageStar(const RsMessageId &mid, bool mark) = 0;
virtual bool MessageLoadEmbeddedImages(const RsMessageId &mid, bool load) = 0;
/* message tagging */
@ -346,8 +351,8 @@ virtual bool getMessageTagTypes(MsgTagType& tags) = 0;
virtual bool setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color) = 0;
virtual bool removeMessageTagType(uint32_t tagId) = 0;
virtual bool getMessageTag(const std::string &msgId, MsgTagInfo& info) = 0;
virtual bool setMessageTag(const std::string &msgId, uint32_t tagId, bool set) = 0;
virtual bool getMessageTag(const RsMessageId &msgId, MsgTagInfo& info) = 0;
virtual bool setMessageTag(const RsMessageId &msgId, uint32_t tagId, bool set) = 0;
virtual bool resetMessageStandardTagTypes(MsgTagType& tags) = 0;

View File

@ -49,6 +49,7 @@
typedef SSLIdType RsPeerId ;
typedef PGPIdType RsPgpId ;
typedef Sha1CheckSum RsFileHash ;
typedef Sha1CheckSum RsMessageId ;
const uint32_t FT_STATE_FAILED = 0x0000 ;
const uint32_t FT_STATE_OKAY = 0x0001 ;

View File

@ -78,7 +78,7 @@ bool p3Msgs::getMessageSummaries(std::list<MsgInfoSummary> &msgList)
bool p3Msgs::getMessage(const std::string &mid, MessageInfo &msg)
bool p3Msgs::getMessage(const RsMessageId &mid, MessageInfo &msg)
{
return mMsgSrv->getMessage(mid, msg);
}
@ -96,7 +96,7 @@ bool p3Msgs::MessageSend(MessageInfo &info)
return mMsgSrv->MessageSend(info);
}
bool p3Msgs::decryptMessage(const std::string& mId)
bool p3Msgs::decryptMessage(const RsMessageId & mId)
{
return mMsgSrv->decryptMessage(mId);
}
@ -114,24 +114,24 @@ bool p3Msgs::SystemMessage(const std::string &title, const std::string &message,
return mMsgSrv->SystemMessage(title, message, systemFlag);
}
bool p3Msgs::MessageToDraft(MessageInfo &info, const std::string &msgParentId)
bool p3Msgs::MessageToDraft(MessageInfo &info, const RsMessageId &msgParentId)
{
return mMsgSrv->MessageToDraft(info, msgParentId);
}
bool p3Msgs::MessageToTrash(const std::string &mid, bool bTrash)
bool p3Msgs::MessageToTrash(const RsMessageId &mid, bool bTrash)
{
return mMsgSrv->MessageToTrash(mid, bTrash);
}
bool p3Msgs::getMsgParentId(const std::string &msgId, std::string &msgParentId)
bool p3Msgs::getMsgParentId(const RsMessageId &msgId, RsMessageId &msgParentId)
{
return mMsgSrv->getMsgParentId(msgId, msgParentId);
}
/****************************************/
/****************************************/
bool p3Msgs::MessageDelete(const std::string &mid)
bool p3Msgs::MessageDelete(const RsMessageId &mid)
{
//std::cerr << "p3Msgs::MessageDelete() ";
//std::cerr << "mid: " << mid << std::endl;
@ -139,7 +139,7 @@ bool p3Msgs::MessageDelete(const std::string &mid)
return mMsgSrv -> removeMsgId(mid);
}
bool p3Msgs::MessageRead(const std::string &mid, bool unreadByUser)
bool p3Msgs::MessageRead(const RsMessageId &mid, bool unreadByUser)
{
//std::cerr << "p3Msgs::MessageRead() ";
//std::cerr << "mid: " << mid << std::endl;
@ -147,17 +147,17 @@ bool p3Msgs::MessageRead(const std::string &mid, bool unreadByUser)
return mMsgSrv -> markMsgIdRead(mid, unreadByUser);
}
bool p3Msgs::MessageReplied(const std::string &mid, bool replied)
bool p3Msgs::MessageReplied(const RsMessageId &mid, bool replied)
{
return mMsgSrv->setMsgFlag(mid, replied ? RS_MSG_FLAGS_REPLIED : 0, RS_MSG_FLAGS_REPLIED);
}
bool p3Msgs::MessageForwarded(const std::string &mid, bool forwarded)
bool p3Msgs::MessageForwarded(const RsMessageId &mid, bool forwarded)
{
return mMsgSrv->setMsgFlag(mid, forwarded ? RS_MSG_FLAGS_FORWARDED : 0, RS_MSG_FLAGS_FORWARDED);
}
bool p3Msgs::MessageLoadEmbeddedImages(const std::string &mid, bool load)
bool p3Msgs::MessageLoadEmbeddedImages(const RsMessageId &mid, bool load)
{
return mMsgSrv->setMsgFlag(mid, load ? RS_MSG_FLAGS_LOAD_EMBEDDED_IMAGES : 0, RS_MSG_FLAGS_LOAD_EMBEDDED_IMAGES);
}
@ -167,7 +167,7 @@ bool p3Msgs::getMessageTagTypes(MsgTagType& tags)
return mMsgSrv->getMessageTagTypes(tags);
}
bool p3Msgs::MessageStar(const std::string &mid, bool star)
bool p3Msgs::MessageStar(const RsMessageId &mid, bool star)
{
return mMsgSrv->setMsgFlag(mid, star ? RS_MSG_FLAGS_STAR : 0, RS_MSG_FLAGS_STAR);
@ -183,12 +183,12 @@ bool p3Msgs::removeMessageTagType(uint32_t tagId)
return mMsgSrv->removeMessageTagType(tagId);
}
bool p3Msgs::getMessageTag(const std::string &msgId, MsgTagInfo& info)
bool p3Msgs::getMessageTag(const RsMessageId &msgId, MsgTagInfo& info)
{
return mMsgSrv->getMessageTag(msgId, info);
}
bool p3Msgs::setMessageTag(const std::string &msgId, uint32_t tagId, bool set)
bool p3Msgs::setMessageTag(const RsMessageId &msgId, uint32_t tagId, bool set)
{
return mMsgSrv->setMessageTag(msgId, tagId, set);
}

View File

@ -55,29 +55,29 @@ class p3Msgs: public RsMsgs
* @param msgList ref to list summarising client's msgs
*/
virtual bool getMessageSummaries(std::list<MsgInfoSummary> &msgList);
virtual bool getMessage(const std::string &mId, MessageInfo &msg);
virtual bool getMessage(const RsMessageId &mId, MessageInfo &msg);
virtual void getMessageCount(unsigned int *pnInbox, unsigned int *pnInboxNew, unsigned int *pnOutbox, unsigned int *pnDraftbox, unsigned int *pnSentbox, unsigned int *pnTrashbox);
virtual bool MessageSend(MessageInfo &info);
virtual bool decryptMessage(const std::string& mid);
virtual bool decryptMessage(const RsMessageId &mid);
virtual bool SystemMessage(const std::string &title, const std::string &message, uint32_t systemFlag);
virtual bool MessageToDraft(MessageInfo &info, const std::string &msgParentId);
virtual bool MessageToTrash(const std::string &mid, bool bTrash);
virtual bool MessageDelete(const std::string &mid);
virtual bool MessageRead(const std::string &mid, bool unreadByUser);
virtual bool MessageReplied(const std::string &mid, bool replied);
virtual bool MessageForwarded(const std::string &mid, bool forwarded);
virtual bool MessageStar(const std::string &mid, bool star);
virtual bool MessageLoadEmbeddedImages(const std::string &mid, bool load);
virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId);
virtual bool MessageToDraft(MessageInfo &info, const RsMessageId &msgParentId);
virtual bool MessageToTrash(const RsMessageId &mid, bool bTrash);
virtual bool MessageDelete(const RsMessageId &mid);
virtual bool MessageRead(const RsMessageId &mid, bool unreadByUser);
virtual bool MessageReplied(const RsMessageId &mid, bool replied);
virtual bool MessageForwarded(const RsMessageId &mid, bool forwarded);
virtual bool MessageStar(const RsMessageId &mid, bool star);
virtual bool MessageLoadEmbeddedImages(const RsMessageId &mid, bool load);
virtual bool getMsgParentId(const RsMessageId &msgId, RsMessageId &msgParentId);
virtual bool getMessageTagTypes(MsgTagType& tags);
virtual bool setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color);
virtual bool removeMessageTagType(uint32_t tagId);
virtual bool getMessageTag(const std::string &msgId, MsgTagInfo& info);
virtual bool getMessageTag(const RsMessageId &msgId, MsgTagInfo& info);
/* set == false && tagId == 0 --> remove all */
virtual bool setMessageTag(const std::string &msgId, uint32_t tagId, bool set);
virtual bool setMessageTag(const RsMessageId &msgId, uint32_t tagId, bool set);
virtual bool resetMessageStandardTagTypes(MsgTagType& tags);

View File

@ -1573,7 +1573,7 @@ uint32_t RsMsgItem::serial_size(bool m_bConfiguration)
if (m_bConfiguration) {
// serialise msgId too
s += 4;
s += GetTlvStringSize(msgId.toStdString());
}
return s;
@ -1609,8 +1609,10 @@ bool RsMsgItem::serialise(void *data, uint32_t& pktsize,bool config)
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_MSG, mimeMessage);
if (config) // serialise msgId too
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_MSGID , msgId);
if( config ){
std::string mId = msgId.toStdString();
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_MSGID , mId);
}
if (offset != tlvsize)
{
@ -1660,7 +1662,9 @@ RsMsgItem *RsMsgSerialiser::deserialiseMsgItem(void *data, uint32_t *pktsize)
ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_MSG, item->mimeMessage);
if (m_bConfiguration) {
GetTlvString(data, rssize, &offset, TLV_TYPE_STR_MSGID, item->msgId ); //use this line for backward compatibility
std::string mId;
GetTlvString(data, rssize, &offset, TLV_TYPE_STR_MSGID, mId ); //use this line for backward compatibility
item->msgId = RsMessageId( mId );
}
if (offset != rssize)
@ -1883,7 +1887,7 @@ uint32_t RsMsgTags::serial_size(bool)
{
uint32_t s = 8; /* header */
s += 4; /* msgId */
s += msgId.serial_size();
s += tagIds.size() * 4; /* tagIds */
return s;
@ -1911,7 +1915,7 @@ bool RsMsgTags::serialise(void *data, uint32_t& pktsize,bool config)
/* skip the header */
offset += 8;
ok &= setRawString(data,tlvsize,&offset, msgId);
ok &= setRawString(data,tlvsize,&offset, msgId.toStdString());
std::list<uint32_t>::iterator mit = tagIds.begin();
for(;mit != tagIds.end(); mit++)
@ -1959,7 +1963,9 @@ RsMsgTags* RsMsgSerialiser::deserialiseMsgTagItem(void* data, uint32_t* pktsize)
/* get mandatory parts first */
ok &= getRawString(data, rssize, &offset, item->msgId);
std::string mId;
ok &= getRawString(data, rssize, &offset, mId);
item->msgId = RsMessageId( mId );
uint32_t tagId;
while (offset != rssize)
@ -2019,7 +2025,7 @@ uint32_t RsMsgSrcId::serial_size(bool)
{
uint32_t s = 8; /* header */
s += 4;
s += msgId.serial_size();
s += srcId.serial_size() ;
return s;
@ -2048,8 +2054,8 @@ bool RsMsgSrcId::serialise(void *data, uint32_t& pktsize,bool config)
/* skip the header */
offset += 8;
ok &= setRawString(data, tlvsize, &offset, msgId);
ok &= srcId.serialise(data, tlvsize, offset) ;
ok &= msgId.serialise(data, tlvsize, offset);
ok &= srcId.serialise(data, tlvsize, offset);
if (offset != tlvsize)
{
@ -2093,7 +2099,12 @@ RsMsgSrcId* RsMsgSerialiser::deserialiseMsgSrcIdItem(void* data, uint32_t* pktsi
/* get mandatory parts first */
ok &= getRawString(data, rssize, &offset, item->msgId );
std::string mId;
ok &= getRawString(data, rssize, &offset, mId );
item->msgId = RsMessageId( mId );
ok &= item->srcId.deserialise(data, rssize, offset);
if (offset != rssize)
@ -2145,8 +2156,8 @@ uint32_t RsMsgParentId::serial_size(bool)
{
uint32_t s = 8; /* header */
s += 4; // srcId
s += 4; // msgParentId
s += msgId.SIZE_IN_BYTES; // srcId
s += msgParentId.SIZE_IN_BYTES; // msgParentId
return s;
}
@ -2173,8 +2184,8 @@ bool RsMsgParentId::serialise(void *data, uint32_t& pktsize,bool config)
/* skip the header */
offset += 8;
ok &= setRawString(data, tlvsize, &offset, msgId);
ok &= setRawString(data, tlvsize, &offset, msgParentId);
ok &= setRawString(data, tlvsize, &offset, msgId.toStdString());
ok &= setRawString(data, tlvsize, &offset, msgParentId.toStdString());
if (offset != tlvsize)
{
@ -2218,8 +2229,12 @@ RsMsgParentId* RsMsgSerialiser::deserialiseMsgParentIdItem(void* data, uint32_t*
/* get mandatory parts first */
ok &= getRawString(data, rssize, &offset, item->msgId );
ok &= getRawString(data, rssize, &offset, item->msgParentId );
std::string mId, mPId;
ok &= getRawString(data, rssize, &offset, mId );
ok &= getRawString(data, rssize, &offset, mPId );
item->msgId = RsMessageId( mId );
item->msgParentId = RsMessageId( mPId );
if (offset != rssize)
{

View File

@ -507,7 +507,7 @@ class RsMsgItem: public RsMessageItem
// ----------- Specific fields ------------- //
uint32_t msgFlags;
std::string msgId;
RsMessageId msgId;
uint32_t sendTime;
uint32_t recvTime;
@ -551,7 +551,7 @@ public:
// ----------- Specific fields ------------- //
//
std::string msgId;
RsMessageId msgId;
std::list<uint32_t> tagIds;
};
@ -571,7 +571,7 @@ class RsMsgSrcId : public RsMessageItem
// ----------- Specific fields ------------- //
//
std::string msgId;
RsMessageId msgId;
RsPeerId srcId;
};
class RsPublicMsgInviteConfigItem : public RsMessageItem
@ -609,8 +609,8 @@ class RsMsgParentId : public RsMessageItem
// ----------- Specific fields ------------- //
//
std::string msgId;
std::string msgParentId;
RsMessageId msgId;
RsMessageId msgParentId;
};
class RsMsgSerialiser: public RsSerialType

View File

@ -116,14 +116,6 @@ RsServiceInfo p3MsgService::getServiceInfo()
}
std::string p3MsgService::getNewUniqueMsgId()
{
// MIME FIXME: This will go into MessageInfo where the ID is generated during message creation. A message will then retain it's id
std::ostringstream mid;
mid << "<" << time(NULL) << "." << RSRandom::random_u64() << "@retroshare>";
return mid.str();
}
int p3MsgService::tick()
{
pqioutput(PQL_DEBUG_BASIC, msgservicezone,
@ -160,9 +152,10 @@ int p3MsgService::status()
void p3MsgService::processMsg(RsMsgItem *mi, bool incoming)
{
mi -> recvTime = time(NULL);
mi -> msgId = getNewUniqueMsgId();
MessageInfo msgInfo( mi->mimeMessage.substr( 0, mi->mimeMessage.find( "\r\n\r\n" ) ) );
mi->msgId = msgInfo.getMessageId();
mi -> recvTime = time(NULL);
{
RsStackMutex stack(mMsgMtx); /*** STACK LOCKED MTX ***/
@ -177,13 +170,13 @@ void p3MsgService::processMsg(RsMsgItem *mi, bool incoming)
if (notify)
{
if(mi->msgFlags & RS_MSG_FLAGS_ENCRYPTED){
// MIME FIXME: notify->AddPopupMessage(RS_POPUP_ENCRYPTED_MSG, mi->PeerId().toStdString(), mi->subject, mi->message);
notify->AddPopupMessage(RS_POPUP_ENCRYPTED_MSG, mi->PeerId().toStdString(), msgInfo.header().subject(), "" );
}
else{
// MIME FIXME: notify->AddPopupMessage(RS_POPUP_MSG, mi->PeerId().toStdString(), mi->subject, mi->message);
notify->AddPopupMessage(RS_POPUP_MSG, mi->PeerId().toStdString(), msgInfo.header().subject(), "" );
}
notify->AddFeedItem(RS_FEED_ITEM_MESSAGE, mi->msgId, "", "");
notify->AddFeedItem(RS_FEED_ITEM_MESSAGE, mi->msgId.toStdString(), "", "");
}
}
else
@ -195,7 +188,7 @@ void p3MsgService::processMsg(RsMsgItem *mi, bool incoming)
RsMsgSrcId* msi = new RsMsgSrcId();
msi->msgId = mi->msgId;
msi->srcId = mi->PeerId();
mSrcIds.insert(std::pair<std::string, RsMsgSrcId*>(msi->msgId, msi));
mSrcIds.insert(std::pair<RsMessageId, RsMsgSrcId*>(msi->msgId, msi));
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
}
@ -346,11 +339,11 @@ int p3MsgService::checkOutgoingMessages()
{
const RsPeerId& ownId = mServiceCtrl->getOwnId();
std::list<std::string>::iterator it;
std::list<std::string> toErase;
std::list<RsMessageId>::iterator it;
std::list<RsMessageId> toErase;
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++)
{
if (mit->second->msgFlags & RS_MSG_FLAGS_TRASH)
@ -402,7 +395,7 @@ int p3MsgService::checkOutgoingMessages()
msgOutgoing.erase(mit);
}
std::map<std::string, RsMsgSrcId*>::iterator srcIt = mSrcIds.find(*it);
std::map<RsMessageId, RsMsgSrcId*>::iterator srcIt = mSrcIds.find(*it);
if (srcIt != mSrcIds.end()) {
delete (srcIt->second);
mSrcIds.erase(srcIt);
@ -427,11 +420,11 @@ int p3MsgService::checkOutgoingMessages()
bool p3MsgService::saveList(bool& cleanup, std::list<RsItem*>& itemList)
{
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
std::map<uint32_t, RsMsgTagType* >::iterator mit2;
std::map<std::string, RsMsgTags* >::iterator mit3;
std::map<std::string, RsMsgSrcId* >::iterator lit;
std::map<std::string, RsMsgParentId* >::iterator mit4;
std::map<RsMessageId, RsMsgTags* >::iterator mit3;
std::map<RsMessageId, RsMsgSrcId* >::iterator lit;
std::map<RsMessageId, RsMsgParentId* >::iterator mit4;
MsgTagType stdTags;
@ -538,8 +531,8 @@ bool p3MsgService::loadList(std::list<RsItem*>& load)
std::list<RsMsgItem*> items;
std::list<RsItem*>::iterator it;
std::map<uint32_t, RsMsgTagType*>::iterator tagIt;
std::map<std::string, RsPeerId> srcIdMsgMap;
std::map<std::string, RsPeerId>::iterator srcIt;
std::map<RsMessageId, RsPeerId> srcIdMsgMap;
std::map<RsMessageId, RsPeerId>::iterator srcIt;
bool distant_messaging_set = false ;
@ -568,16 +561,16 @@ bool p3MsgService::loadList(std::list<RsItem*>& load)
}
else if(NULL != (mti = dynamic_cast<RsMsgTags *>(*it)))
{
mMsgTags.insert(std::pair<std::string, RsMsgTags* >(mti->msgId, mti));
mMsgTags.insert(std::pair<RsMessageId, RsMsgTags* >(mti->msgId, mti));
}
else if(NULL != (msi = dynamic_cast<RsMsgSrcId *>(*it)))
{
srcIdMsgMap.insert(std::pair<std::string, RsPeerId>(msi->msgId, msi->srcId));
mSrcIds.insert(std::pair<std::string, RsMsgSrcId*>(msi->msgId, msi)); // does not need to be kept
srcIdMsgMap.insert(std::pair<RsMessageId, RsPeerId>(msi->msgId, msi->srcId));
mSrcIds.insert(std::pair<RsMessageId, RsMsgSrcId*>(msi->msgId, msi)); // does not need to be kept
}
else if(NULL != (msp = dynamic_cast<RsMsgParentId *>(*it)))
{
mParentId.insert(std::pair<std::string, RsMsgParentId*>(msp->msgId, msp));
mParentId.insert(std::pair<RsMessageId, RsMsgParentId*>(msp->msgId, msp));
}
RsConfigKeyValueSet *vitem = NULL ;
@ -608,11 +601,6 @@ bool p3MsgService::loadList(std::list<RsItem*>& load)
{
mitem = *msgIt;
/* STORE MsgID */
if (mitem->msgId.empty()) {
mitem->msgId = getNewUniqueMsgId();
}
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
srcIt = srcIdMsgMap.find(mitem->msgId);
@ -643,7 +631,7 @@ bool p3MsgService::loadList(std::list<RsItem*>& load)
/* remove missing msgId in mSrcIds */
for (srcIt = srcIdMsgMap.begin(); srcIt != srcIdMsgMap.end(); srcIt++) {
std::map<std::string, RsMsgSrcId*>::iterator it = mSrcIds.find(srcIt->first);
std::map<RsMessageId, RsMsgSrcId*>::iterator it = mSrcIds.find(srcIt->first);
if (it != mSrcIds.end()) {
delete(it->second);
mSrcIds.erase(it);
@ -651,7 +639,7 @@ bool p3MsgService::loadList(std::list<RsItem*>& load)
}
/* remove missing msgId in mParentId */
std::map<std::string, RsMsgParentId *>::iterator mit = mParentId.begin();
std::map<RsMessageId, RsMsgParentId *>::iterator mit = mParentId.begin();
while (mit != mParentId.end()) {
if (imsg.find(mit->first) == imsg.end()) {
if (msgOutgoing.find(mit->first) == msgOutgoing.end()) {
@ -687,7 +675,7 @@ void p3MsgService::loadWelcomeMsg()
"Enjoy.";
mi.body().set( body );
msg -> msgId = getNewUniqueMsgId();
msg -> msgId = mi.getMessageId();
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
@ -714,7 +702,7 @@ bool p3MsgService::getMessageSummaries(std::list<MsgInfoSummary> &msgList)
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
for(mit = imsg.begin(); mit != imsg.end(); mit++)
{
MsgInfoSummary mis;
@ -731,9 +719,9 @@ bool p3MsgService::getMessageSummaries(std::list<MsgInfoSummary> &msgList)
return true;
}
bool p3MsgService::getMessage(const std::string &msgId, MessageInfo &msg)
bool p3MsgService::getMessage(const RsMessageId &msgId, MessageInfo &msg)
{
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
@ -750,7 +738,7 @@ bool p3MsgService::getMessage(const std::string &msgId, MessageInfo &msg)
/* mit valid */
initRsMI(mit->second, msg);
std::map<std::string, RsMsgSrcId*>::const_iterator it = mSrcIds.find(msgId) ;
std::map<RsMessageId, RsMsgSrcId*>::const_iterator it = mSrcIds.find(msgId) ;
if(it != mSrcIds.end())
msg.rsgxsid_srcId = RsGxsId(it->second->srcId) ;
@ -768,8 +756,8 @@ void p3MsgService::getMessageCount(unsigned int *pnInbox, unsigned int *pnInboxN
if (pnSentbox) *pnSentbox = 0;
if (pnTrashbox) *pnTrashbox = 0;
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<std::string, RsMsgItem *> *apMsg [2] = { &imsg, &msgOutgoing };
std::map<RsMessageId, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *> *apMsg [2] = { &imsg, &msgOutgoing };
for (int i = 0; i < 2; i++) {
for (mit = apMsg [i]->begin(); mit != apMsg [i]->end(); mit++) {
@ -802,10 +790,10 @@ void p3MsgService::getMessageCount(unsigned int *pnInbox, unsigned int *pnInboxN
}
/* remove based on the unique mid (stored in sid) */
bool p3MsgService::removeMsgId(const std::string &msgId)
bool p3MsgService::removeMsgId(const RsMessageId &msgId)
{
std::map<std::string, RsMsgItem *>::iterator mit;
if ( msgId.empty() ) {
std::map<RsMessageId, RsMsgItem *>::iterator mit;
if ( msgId.isNull() ) {
std::cerr << "p3MsgService::removeMsgId: Unknown msgId " << msgId << std::endl;
return false;
}
@ -833,7 +821,7 @@ bool p3MsgService::removeMsgId(const std::string &msgId)
delete mi;
}
std::map<std::string, RsMsgSrcId*>::iterator srcIt = mSrcIds.find(msgId);
std::map<RsMessageId, RsMsgSrcId*>::iterator srcIt = mSrcIds.find(msgId);
if (srcIt != mSrcIds.end()) {
changed = true;
delete (srcIt->second);
@ -845,7 +833,7 @@ bool p3MsgService::removeMsgId(const std::string &msgId)
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
setMessageTag(msgId, 0, false);
setMsgParentId(msgId, 0);
setMsgParentId(msgId, RsMessageId());
RsServer::notify()->notifyListChange(NOTIFY_LIST_MESSAGELIST,NOTIFY_TYPE_MOD);
}
@ -853,9 +841,9 @@ bool p3MsgService::removeMsgId(const std::string &msgId)
return changed;
}
bool p3MsgService::markMsgIdRead(const std::string &msgId, bool unreadByUser)
bool p3MsgService::markMsgIdRead(const RsMessageId &msgId, bool unreadByUser)
{
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
bool changed = false;
{
@ -895,9 +883,9 @@ bool p3MsgService::markMsgIdRead(const std::string &msgId, bool unreadByUser)
return true;
}
bool p3MsgService::setMsgFlag(const std::string &msgId, uint32_t flag, uint32_t mask)
bool p3MsgService::setMsgFlag(const RsMessageId &msgId, uint32_t flag, uint32_t mask)
{
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
bool changed = false;
{
@ -931,13 +919,13 @@ bool p3MsgService::setMsgFlag(const std::string &msgId, uint32_t flag, uint32
return true;
}
bool p3MsgService::getMsgParentId(const std::string &msgId, std::string &msgParentId)
bool p3MsgService::getMsgParentId(const RsMessageId &msgId, RsMessageId &msgParentId)
{
msgParentId.clear();
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
std::map<std::string, RsMsgParentId *>::iterator mit = mParentId.find( msgId );
std::map<RsMessageId, RsMsgParentId *>::iterator mit = mParentId.find( msgId );
if (mit == mParentId.end()) {
return false;
}
@ -947,9 +935,9 @@ bool p3MsgService::getMsgParentId(const std::string &msgId, std::string &msgP
return true;
}
bool p3MsgService::setMsgParentId(std::string msgId, const std::string & msgParentId)
bool p3MsgService::setMsgParentId(RsMessageId msgId, const RsMessageId & msgParentId)
{
std::map<std::string, RsMsgParentId *>::iterator mit;
std::map<RsMessageId, RsMsgParentId *>::iterator mit;
bool changed = false;
@ -959,17 +947,17 @@ bool p3MsgService::setMsgParentId(std::string msgId, const std::string & msgP
mit = mParentId.find(msgId);
if (mit == mParentId.end())
{
if ( !msgParentId.empty() ) {
if ( !msgParentId.isNull() ) {
RsMsgParentId* msp = new RsMsgParentId();
msp->PeerId (mServiceCtrl->getOwnId());
msp->msgId = msgId;
msp->msgParentId = msgParentId;
mParentId.insert(std::pair<std::string, RsMsgParentId*>(msgId, msp));
mParentId.insert(std::pair<RsMessageId, RsMsgParentId*>(msgId, msp));
changed = true;
}
} else {
if ( !msgParentId.empty() ) {
if ( !msgParentId.isNull() ) {
if (mit->second->msgParentId != msgParentId) {
mit->second->msgParentId = msgParentId;
changed = true;
@ -1000,8 +988,6 @@ int p3MsgService::sendMessage(RsMsgItem *item)
pqioutput(PQL_DEBUG_BASIC, msgservicezone,
"p3MsgService::sendMessage()");
item -> msgId = getNewUniqueMsgId(); /* grabs Mtx as well */
{
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
@ -1015,7 +1001,7 @@ int p3MsgService::sendMessage(RsMsgItem *item)
RsMsgSrcId* msi = new RsMsgSrcId();
msi->msgId = item->msgId;
msi->srcId = item->PeerId();
mSrcIds.insert(std::pair<std::string, RsMsgSrcId*>(msi->msgId, msi));
mSrcIds.insert(std::pair<RsMessageId, RsMsgSrcId*>(msi->msgId, msi));
}
}
@ -1095,9 +1081,6 @@ bool p3MsgService::MessageSend(MessageInfo &info)
/* use processMsg to get the new msgId */
processMsg(msg, false);
// return new message id
info.header().messageid() = msg->msgId;
}
return true;
@ -1141,21 +1124,17 @@ bool p3MsgService::SystemMessage(const std::string &title, const std::string &me
return true;
}
bool p3MsgService::MessageToDraft(MessageInfo &info, const std::string &msgParentId)
bool p3MsgService::MessageToDraft(MessageInfo &info, const RsMessageId &msgParentId)
{
RsMsgItem *msg = initMIRsMsg(info, mServiceCtrl->getOwnId());
if (msg)
{
std::string msgId;
RsMessageId msgId;
if ( !info.header().messageid().str().empty() ) {
msgId = info.header().messageid().str();
msgId = info.getMessageId();
}
if ( !msgId.empty() ) {
msg->msgId = msgId;
} else {
msg->msgId = getNewUniqueMsgId(); /* grabs Mtx as well */
}
{
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
@ -1163,9 +1142,9 @@ bool p3MsgService::MessageToDraft(MessageInfo &info, const std::string &msgParen
/* add pending flag */
msg->msgFlags |= (RS_MSG_OUTGOING | RS_MSG_FLAGS_DRAFT);
if ( !msgId.empty() ) {
if ( !msgId.isNull() ) {
// remove existing message
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
mit = imsg.find(msgId);
if (mit != imsg.end()) {
RsMsgItem *mi = mit->second;
@ -1175,9 +1154,6 @@ bool p3MsgService::MessageToDraft(MessageInfo &info, const std::string &msgParen
}
/* STORE MsgID */
imsg[msg->msgId] = msg;
// return new message id
info.header().messageid( msg->msgId );
}
setMsgParentId( msg->msgId, msgParentId );
@ -1282,7 +1258,7 @@ bool p3MsgService::removeMessageTagType(uint32_t tagId)
}
/* search for messages with this tag type */
std::map<std::string, RsMsgTags*>::iterator mit1;
std::map<RsMessageId, RsMsgTags*>::iterator mit1;
for (mit1 = mMsgTags.begin(); mit1 != mMsgTags.end(); ) {
RsMsgTags* tag = mit1->second;
@ -1315,16 +1291,16 @@ bool p3MsgService::removeMessageTagType(uint32_t tagId)
return true;
}
bool p3MsgService::getMessageTag(const std::string &msgId, MsgTagInfo& info)
bool p3MsgService::getMessageTag(const RsMessageId &msgId, MsgTagInfo& info)
{
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
if ( msgId.empty() ) {
if ( msgId.isNull() ) {
std::cerr << "p3MsgService::MessageGetMsgTag: Unknown msgId " << msgId << std::endl;
return false;
}
std::map<std::string, RsMsgTags*>::iterator mit;
std::map<RsMessageId, RsMsgTags*>::iterator mit;
if(mMsgTags.end() != ( mit = mMsgTags.find( msgId ))) {
info.msgId = mit->second->msgId;
@ -1337,9 +1313,9 @@ bool p3MsgService::getMessageTag(const std::string &msgId, MsgTagInfo& info)
}
/* set == false && tagId == 0 --> remove all */
bool p3MsgService::setMessageTag(const std::string &msgId, uint32_t tagId, bool set)
bool p3MsgService::setMessageTag(const RsMessageId &msgId, uint32_t tagId, bool set)
{
if ( msgId.empty() ) {
if ( msgId.isNull() ) {
std::cerr << "p3MsgService::MessageSetMsgTag: Unknown msgId " << msgId << std::endl;
return false;
}
@ -1356,7 +1332,7 @@ bool p3MsgService::setMessageTag(const std::string &msgId, uint32_t tagId, bool
{
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
std::map<std::string, RsMsgTags*>::iterator mit;
std::map<RsMessageId, RsMsgTags*>::iterator mit;
mit = mMsgTags.find( msgId );
if (mit == mMsgTags.end()) {
@ -1368,7 +1344,7 @@ bool p3MsgService::setMessageTag(const std::string &msgId, uint32_t tagId, bool
tag->msgId = msgId;
tag->tagIds.push_back(tagId);
mMsgTags.insert(std::pair<std::string, RsMsgTags*>(tag->msgId, tag));
mMsgTags.insert(std::pair<RsMessageId, RsMsgTags*>(tag->msgId, tag));
nNotifyType = NOTIFY_TYPE_ADD;
}
@ -1438,9 +1414,9 @@ bool p3MsgService::resetMessageStandardTagTypes(MsgTagType& tags)
}
/* move message to trash based on the unique mid */
bool p3MsgService::MessageToTrash(const std::string &msgId, bool bTrash)
bool p3MsgService::MessageToTrash(const RsMessageId &msgId, bool bTrash)
{
std::map<std::string, RsMsgItem *>::iterator mit;
std::map<RsMessageId, RsMsgItem *>::iterator mit;
bool bChanged = false;
bool bFound = false;
@ -1610,15 +1586,17 @@ void p3MsgService::initRsMIS(RsMsgItem *msg, MsgInfoSummary &mis)
mis.ts = msg->sendTime;
}
void p3MsgService::initMIRsMsg(RsMsgItem *msg, MessageInfo info)
void p3MsgService::initMIRsMsg(RsMsgItem *msg, MessageInfo & info)
{
msg -> msgFlags = 0;
msg -> msgId.clear();
msg -> sendTime = time(NULL);
msg -> recvTime = 0;
msg -> msgId = info.getMessageId();
/* We don't fill in bcc (unless to ourselves) */
// MIME FIXME: Do not delete BCC fields for SMTP mails to a gateway
// MIME FIXME: the following used to clear BCC from a copy. Now it is the original. BCC needs to be treated outside of the MimeEntity tree
if (msg->PeerId() == mServiceCtrl->getOwnId()){
info.header().bcc().clear();
}
@ -1632,7 +1610,7 @@ void p3MsgService::initMIRsMsg(RsMsgItem *msg, MessageInfo info)
if (info.msgflags & RS_MSG_FRIEND_RECOMMENDATION)
msg->msgFlags |= RS_MSG_FLAGS_FRIEND_RECOMMENDATION;
}
RsMsgItem *p3MsgService::initMIRsMsg( const MessageInfo& info, const RsGxsId& to)
RsMsgItem *p3MsgService::initMIRsMsg( MessageInfo& info, const RsGxsId& to)
{
RsMsgItem *msg = new RsMsgItem();
@ -1657,7 +1635,7 @@ RsMsgItem *p3MsgService::initMIRsMsg( const MessageInfo& info, const RsGxsId& to
return msg ;
}
RsMsgItem *p3MsgService::initMIRsMsg( const MessageInfo &info, const RsPeerId& to)
RsMsgItem *p3MsgService::initMIRsMsg( MessageInfo &info, const RsPeerId& to)
{
RsMsgItem *msg = new RsMsgItem();
@ -1830,7 +1808,7 @@ std::string printNumber(uint32_t n,bool hex)
os << n ;
return os.str() ;
}
bool p3MsgService::decryptMessage(const std::string& msgId)
bool p3MsgService::decryptMessage(const RsMessageId& msgId)
{
uint8_t *decrypted_data = NULL;
char *encrypted_data = NULL;
@ -1846,7 +1824,7 @@ bool p3MsgService::decryptMessage(const std::string& msgId)
{
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
std::map<std::string, RsMsgItem *>::iterator mit = imsg.find(msgId);
std::map<RsMessageId, RsMsgItem *>::iterator mit = imsg.find(msgId);
if(mit == imsg.end())
{
@ -2046,7 +2024,7 @@ bool p3MsgService::decryptMessage(const std::string& msgId)
msgi.msgFlags &= ~RS_MSG_FLAGS_SIGNATURE_CHECKS ; // just in case.
}
std::map<std::string, RsMsgSrcId*>::iterator it = mSrcIds.find(msgi.msgId) ;
std::map<RsMessageId, RsMsgSrcId*>::iterator it = mSrcIds.find(msgi.msgId) ;
if(it == mSrcIds.end())
{
@ -2056,7 +2034,7 @@ bool p3MsgService::decryptMessage(const std::string& msgId)
msi->msgId = msgi.msgId;
msi->srcId = RsPeerId(senders_id) ;
mSrcIds.insert(std::pair<std::string, RsMsgSrcId*>(msi->msgId, msi));
mSrcIds.insert(std::pair<RsMessageId, RsMsgSrcId*>(msi->msgId, msi));
}
else
{
@ -2169,7 +2147,7 @@ void p3MsgService::acknowledgeDataReceived(const GRouterMsgPropagationId& id)
#ifdef DEBUG_DISTANT_MSG
std::cerr << "p3MsgService::acknowledgeDataReceived(): acknowledging data received for msg propagation id " << id << std::endl;
#endif
std::map<GRouterMsgPropagationId,std::string>::iterator it = _ongoing_messages.find(id) ;
std::map<GRouterMsgPropagationId,RsMessageId>::iterator it = _ongoing_messages.find(id) ;
if(it == _ongoing_messages.end())
{
@ -2177,11 +2155,11 @@ void p3MsgService::acknowledgeDataReceived(const GRouterMsgPropagationId& id)
return ;
}
std::string msg_id = it->second ;
RsMessageId msg_id = it->second ;
// we should now remove the item from the msgOutgoing list.
std::map<std::string,RsMsgItem*>::iterator it2 = msgOutgoing.find(msg_id) ;
std::map<RsMessageId,RsMsgItem*>::iterator it2 = msgOutgoing.find(msg_id) ;
if(it2 == msgOutgoing.end())
{
@ -2238,6 +2216,22 @@ void p3MsgService::sendPrivateMsgItem(RsMsgItem *msgitem)
// We assume that there will never be a "retroshare" TLD
static const char * RSPEERID_POSTFIX = "rspeerid.retroshare";
static const char * RSGXSID_POSTFIX = "rsgxsid.retroshare";
static const char * RSMSGID_POSTFIX = "retroshare";
MessageInfo::MessageInfo()
{
std::ostringstream mid;
mid << "<" << time(NULL) << "." << RSRandom::random_u64() << "@" << RSMSGID_POSTFIX << ">";
header().messageid() = mid.str();
}
RsMessageId MessageInfo::getMessageId()
{
std::string id = header().messageid().str();
return RsDirUtil::sha1sum( (unsigned char*)id.c_str(), id.length() );
}
void MessageInfo::setMessage( const std::string & msg )
{

View File

@ -62,29 +62,29 @@ class p3MsgService: public p3Service, public p3Config, public pqiServiceMonitor,
/* External Interface */
bool getMessageSummaries(std::list<MsgInfoSummary> &msgList);
bool getMessage(const std::string &mid, MessageInfo &msg);
bool getMessage(const RsMessageId &mid, MessageInfo &msg);
void getMessageCount(unsigned int *pnInbox, unsigned int *pnInboxNew, unsigned int *pnOutbox, unsigned int *pnDraftbox, unsigned int *pnSentbox, unsigned int *pnTrashbox);
bool decryptMessage(const std::string& mid) ;
bool removeMsgId(const std::string &mid);
bool markMsgIdRead(const std::string &mid, bool bUnreadByUser);
bool setMsgFlag(const std::string &mid, uint32_t flag, uint32_t mask);
bool getMsgParentId(const std::string &msgId, std::string &msgParentId);
bool decryptMessage(const RsMessageId &mid) ;
bool removeMsgId(const RsMessageId &mid);
bool markMsgIdRead(const RsMessageId &mid, bool bUnreadByUser);
bool setMsgFlag(const RsMessageId &mid, uint32_t flag, uint32_t mask);
bool getMsgParentId(const RsMessageId &msgId, RsMessageId &msgParentId);
// msgParentId == 0 --> remove
bool setMsgParentId(std::string msgId, const std::string &msgParentId);
bool setMsgParentId(RsMessageId msgId, const RsMessageId &msgParentId);
bool MessageSend(MessageInfo &info);
bool SystemMessage(const std::string &title, const std::string &message, uint32_t systemFlag);
bool MessageToDraft(MessageInfo &info, const std::string &msgParentId);
bool MessageToTrash(const std::string &mid, bool bTrash);
bool MessageToDraft(MessageInfo &info, const RsMessageId &msgParentId);
bool MessageToTrash(const RsMessageId &mid, bool bTrash);
bool getMessageTagTypes(MsgTagType& tags);
bool setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color);
bool removeMessageTagType(uint32_t tagId);
bool getMessageTag(const std::string &msgId, MsgTagInfo& info);
bool getMessageTag(const RsMessageId &msgId, MsgTagInfo& info);
/* set == false && tagId == 0 --> remove all */
bool setMessageTag(const std::string &msgId, uint32_t tagId, bool set);
bool setMessageTag(const RsMessageId &msgId, uint32_t tagId, bool set);
bool resetMessageStandardTagTypes(MsgTagType& tags);
@ -132,7 +132,7 @@ class p3MsgService: public p3Service, public p3Config, public pqiServiceMonitor,
// This contains the ongoing tunnel handling contacts.
// The map is indexed by the hash
//
std::map<GRouterMsgPropagationId,std::string> _ongoing_messages ;
std::map<GRouterMsgPropagationId,RsMessageId> _ongoing_messages ;
// Overloaded from GRouterClientService
@ -149,7 +149,6 @@ class p3MsgService: public p3Service, public p3Config, public pqiServiceMonitor,
void handleIncomingItem(RsMsgItem *) ;
std::string getNewUniqueMsgId();
int sendMessage(RsMsgItem *item);
void checkSizeAndSendMessage(RsMsgItem *msg);
@ -160,9 +159,9 @@ class p3MsgService: public p3Service, public p3Config, public pqiServiceMonitor,
void initRsMI(RsMsgItem *msg, MessageInfo &mi);
void initRsMIS(RsMsgItem *msg, MsgInfoSummary &mis);
RsMsgItem *initMIRsMsg(const MessageInfo &info, const RsPeerId& to);
RsMsgItem *initMIRsMsg(const MessageInfo &info, const RsGxsId& to);
void initMIRsMsg(RsMsgItem *item, MessageInfo info) ;
RsMsgItem *initMIRsMsg(MessageInfo &info, const RsPeerId& to);
RsMsgItem *initMIRsMsg(MessageInfo &info, const RsGxsId& to);
void initMIRsMsg(RsMsgItem *item, MessageInfo &info) ;
void initStandardTagTypes();
@ -176,24 +175,24 @@ class p3MsgService: public p3Service, public p3Config, public pqiServiceMonitor,
RsMsgSerialiser *_serialiser ;
/* stored list of messages */
std::map<std::string, RsMsgItem *> imsg;
std::map<RsMessageId, RsMsgItem *> imsg;
/* ones that haven't made it out yet! */
std::map<std::string, RsMsgItem *> msgOutgoing;
std::map<RsMessageId, RsMsgItem *> msgOutgoing;
std::map<RsPeerId, RsMsgItem *> _pendingPartialMessages ;
/* maps for tags types and msg tags */
std::map<uint32_t, RsMsgTagType*> mTags;
std::map<std::string, RsMsgTags*> mMsgTags;
std::map<RsMessageId, RsMsgTags*> mMsgTags;
uint32_t mMsgUniqueId;
// used delete msgSrcIds after config save
std::map< std::string, RsMsgSrcId*> mSrcIds;
std::map<RsMessageId, RsMsgSrcId*> mSrcIds;
// save the parent of the messages in draft for replied and forwarded
std::map<std::string, RsMsgParentId*> mParentId;
std::map<RsMessageId, RsMsgParentId*> mParentId;
std::string config_dir;

View File

@ -151,7 +151,7 @@ MessagesDialog::MessagesDialog(QWidget *parent)
listMode = LIST_NOTHING;
mCurrMsgId = "";
mCurrMsgId = RsMessageId();
// Set the QStandardItemModel
MessagesModel = new QStandardItemModel(0, COLUMN_COUNT);
@ -531,8 +531,8 @@ bool MessagesDialog::hasMessageStar(int nRow)
void MessagesDialog::messageslistWidgetCustomPopupMenu( QPoint /*point*/ )
{
std::string cid;
std::string mid;
RsPeerId cid;
RsMessageId mid;
MessageInfo msgInfo;
if (getCurrentMsg(cid, mid)) {
@ -659,8 +659,8 @@ void MessagesDialog::newmessage()
void MessagesDialog::openAsWindow()
{
std::string cid;
std::string mid;
RsPeerId cid;
RsMessageId mid;
if(!getCurrentMsg(cid, mid))
return ;
@ -677,8 +677,8 @@ void MessagesDialog::openAsWindow()
void MessagesDialog::openAsTab()
{
std::string cid;
std::string mid;
RsPeerId cid;
RsMessageId mid;
if(!getCurrentMsg(cid, mid))
return ;
@ -696,8 +696,8 @@ void MessagesDialog::openAsTab()
void MessagesDialog::editmessage()
{
std::string cid;
std::string mid;
RsPeerId cid;
RsMessageId mid;
if(!getCurrentMsg(cid, mid))
return ;
@ -1001,7 +1001,7 @@ void MessagesDialog::insertMessages()
for (nRow = 0; nRow < nRowCount; ) {
std::string msgIdFromRow = MessagesModel->item(nRow, COLUMN_DATA)->data(ROLE_MSGID).toString().toStdString();
for(it = msgToShow.begin(); it != msgToShow.end(); it++) {
if (it->msgId == msgIdFromRow) {
if (it->msgId == RsMessageId(msgIdFromRow)) {
break;
}
}
@ -1040,7 +1040,7 @@ void MessagesDialog::insertMessages()
// search exisisting items
nRowCount = MessagesModel->rowCount();
for (nRow = 0; nRow < nRowCount; nRow++) {
if (it->msgId == MessagesModel->item(nRow, COLUMN_DATA)->data(ROLE_MSGID).toString().toStdString()) {
if (it->msgId == RsMessageId( MessagesModel->item(nRow, COLUMN_DATA)->data(ROLE_MSGID).toString().toStdString())) {
break;
}
}
@ -1160,7 +1160,7 @@ void MessagesDialog::insertMessages()
item[COLUMN_SUBJECT]->setData(text + dateString, ROLE_SORT);
// internal data
QString msgId = QString::fromStdString(it->msgId);
QString msgId = QString::fromStdString(it->msgId.toStdString() );
item[COLUMN_DATA]->setData(QString::fromStdString(it->srcId.toStdString()), ROLE_SRCID);
item[COLUMN_DATA]->setData(msgId, ROLE_MSGID);
item[COLUMN_DATA]->setData(it->msgflags, ROLE_MSGFLAGS);
@ -1210,27 +1210,28 @@ void MessagesDialog::insertMessages()
item[i]->setForeground(brush);
}
// No of Files.
{
// MIME FIXME: item[COLUMN_ATTACHEMENTS] -> setText(QString::number(it -> count));
item[COLUMN_ATTACHEMENTS] -> setData(item[COLUMN_ATTACHEMENTS]->text() + dateString, ROLE_SORT);
item[COLUMN_ATTACHEMENTS] -> setTextAlignment(Qt::AlignHCenter);
}
unsigned int filecount = 0;
if (filterColumn == COLUMN_CONTENT) {
// need content for filter
if (gotInfo || rsMsgs->getMessage(it->msgId, msgInfo)) {
gotInfo = true;
QTextDocument doc;
mimetic::MimeEntityList meList = msgInfo.body().parts();
std::string body;
for( mimetic::MimeEntityList::const_iterator it = meList.begin(); it != meList.end(); it++ ){
if( msgInfo.header().contentType().str() == "multipart/mixed" ){
mimetic::MimeEntityList & parts = msgInfo.body().parts();
filecount = parts.size() - 1; // first part will be the text body
for( mimetic::MimeEntityList::const_iterator it = parts.begin(); it != parts.end(); it++ ){
mimetic::MimeEntity * part = *it;
if( part->header().contentType().type() == "text" ){
body = part->body().data();
std::string body = part->body().data();
doc.setHtml( QString::fromUtf8( body.c_str() ) );
break;
}
}
}
else if( msgInfo.header().contentType().type() == "text" ){
std::string body = msgInfo.body().data();
doc.setHtml( QString::fromUtf8( body.c_str() ) );
}
item[COLUMN_CONTENT]->setText(doc.toPlainText().replace(QString("\n"), QString(" ")));
} else {
std::cerr << "MessagesDialog::insertMsgTxtAndFiles() Couldn't find Msg" << std::endl;
@ -1238,6 +1239,13 @@ void MessagesDialog::insertMessages()
}
}
// No of Files.
{
item[COLUMN_ATTACHEMENTS] -> setText(QString::number( filecount ));
item[COLUMN_ATTACHEMENTS] -> setData(item[COLUMN_ATTACHEMENTS]->text() + dateString, ROLE_SORT);
item[COLUMN_ATTACHEMENTS] -> setTextAlignment(Qt::AlignHCenter);
}
if(it->msgflags & RS_MSG_ENCRYPTED)
{
item[COLUMN_SIGNATURE]->setIcon(QIcon(":/images/blue_lock.png")) ;
@ -1339,8 +1347,8 @@ void MessagesDialog::doubleClicked(const QModelIndex &index)
/* activate row */
clicked (index);
std::string cid;
std::string mid;
RsPeerId cid;
RsMessageId mid;
if(!getCurrentMsg(cid, mid))
return ;
@ -1386,7 +1394,7 @@ void MessagesDialog::setMsgAsReadUnread(const QList<int> &Rows, bool read)
std::string mid = item[COLUMN_DATA]->data(ROLE_MSGID).toString().toStdString();
if (rsMsgs->MessageRead(mid, !read)) {
if (rsMsgs->MessageRead(RsMessageId(mid), !read)) {
int msgFlag = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt();
msgFlag &= ~RS_MSG_NEW;
@ -1444,7 +1452,7 @@ void MessagesDialog::setMsgStar(const QList<int> &Rows, bool star)
std::string mid = item[COLUMN_DATA]->data(ROLE_MSGID).toString().toStdString();
if (rsMsgs->MessageStar(mid, star)) {
if (rsMsgs->MessageStar(RsMessageId(mid), star)) {
int msgFlag = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt();
msgFlag &= ~RS_MSG_STAR;
@ -1470,8 +1478,8 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
std::cerr << "MessagesDialog::insertMsgTxtAndFiles()" << std::endl;
/* get its Ids */
std::string cid;
std::string mid;
RsMessageId cid;
RsMessageId mid;
QModelIndex currentIndex = proxyModel->mapToSource(Index);
if (currentIndex.isValid() == false) {
@ -1488,7 +1496,7 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead)
updateInterface();
return;
}
mid = item->data(ROLE_MSGID).toString().toStdString();
mid = RsMessageId(item->data(ROLE_MSGID).toString().toStdString());
int nCount = getSelectedMsgCount (NULL, NULL, NULL, NULL);
if (nCount == 1) {
@ -1550,12 +1558,12 @@ void MessagesDialog::decryptSelectedMsg()
// Force refill
mCurrMsgId.clear();
msgWidget->fill("");
msgWidget->fill(RsMessageId());
insertMsgTxtAndFiles(ui.messagestreeView->currentIndex());
}
bool MessagesDialog::getCurrentMsg(std::string &cid, std::string &mid)
bool MessagesDialog::getCurrentMsg(RsPeerId &cid, RsMessageId &mid)
{
QModelIndex currentIndex = ui.messagestreeView->currentIndex();
currentIndex = proxyModel->mapToSource(currentIndex);
@ -1583,8 +1591,8 @@ bool MessagesDialog::getCurrentMsg(std::string &cid, std::string &mid)
if (item == NULL) {
return false;
}
cid = item->data(ROLE_SRCID).toString().toStdString();
mid = item->data(ROLE_MSGID).toString().toStdString();
cid = RsPeerId(item->data(ROLE_SRCID).toString().toStdString());
mid = RsMessageId(item->data(ROLE_MSGID).toString().toStdString());
return true;
}
@ -1623,9 +1631,9 @@ void MessagesDialog::removemessage()
// closeTab(mid.toStdString());
if (bDelete) {
rsMsgs->MessageDelete(mid.toStdString());
rsMsgs->MessageDelete(RsMessageId(mid.toStdString()));
} else {
rsMsgs->MessageToTrash(mid.toStdString(), true);
rsMsgs->MessageToTrash(RsMessageId(mid.toStdString()), true);
}
}
}
@ -1641,7 +1649,7 @@ void MessagesDialog::undeletemessage()
getSelectedMsgCount (&Rows, NULL, NULL, NULL);
for (int nRow = 0; nRow < Rows.size(); nRow++) {
QString mid = MessagesModel->item (Rows [nRow], COLUMN_DATA)->data(ROLE_MSGID).toString();
rsMsgs->MessageToTrash(mid.toStdString(), false);
rsMsgs->MessageToTrash(RsMessageId(mid.toStdString()), false);
}
// LockUpdate -> insertMessages();
@ -1911,7 +1919,7 @@ void MessagesDialog::tagAboutToShow()
QStandardItem* item = MessagesModel->item(rows [0], COLUMN_DATA);
std::string msgId = item->data(ROLE_MSGID).toString().toStdString();
rsMsgs->getMessageTag(msgId, tagInfo);
rsMsgs->getMessageTag(RsMessageId(msgId), tagInfo);
}
menu->activateActions(tagInfo.tagIds);
@ -1927,7 +1935,7 @@ void MessagesDialog::tagRemoveAll()
QStandardItem* item = MessagesModel->item(rows [row], COLUMN_DATA);
std::string msgId = item->data(ROLE_MSGID).toString().toStdString();
rsMsgs->setMessageTag(msgId, 0, false);
rsMsgs->setMessageTag(RsMessageId(msgId), 0, false);
Lock.setUpdate(true);
}
@ -1948,7 +1956,7 @@ void MessagesDialog::tagSet(int tagId, bool set)
QStandardItem* item = MessagesModel->item(rows [row], COLUMN_DATA);
std::string msgId = item->data(ROLE_MSGID).toString().toStdString();
if (rsMsgs->setMessageTag(msgId, tagId, set)) {
if (rsMsgs->setMessageTag(RsMessageId(msgId), tagId, set)) {
Lock.setUpdate(true);
}
}
@ -1992,7 +2000,7 @@ void MessagesDialog::tabCloseRequested(int tab)
}
}
void MessagesDialog::closeTab(const std::string &msgId)
void MessagesDialog::closeTab(const RsMessageId &msgId)
{
QList<MessageWidget*> msgWidgets;
@ -2063,7 +2071,7 @@ void MessagesDialog::updateInterface()
count = getSelectedMsgCount(NULL, NULL, NULL, NULL);
} else {
MessageWidget *msg = dynamic_cast<MessageWidget*>(ui.tabWidget->widget(tab));
if (msg && msg->msgId().empty() == false) {
if (msg && msg->msgId().isNull() == false) {
count = 1;
}
}

View File

@ -26,6 +26,7 @@
#include "mainpage.h"
#include "ui_MessagesDialog.h"
#include <retroshare/rsmsgs.h>
#define IMAGE_MESSAGES ":/images/evolution.png"
@ -127,7 +128,7 @@ private:
void updateMessageSummaryList();
void insertMsgTxtAndFiles(QModelIndex index = QModelIndex(), bool bSetToRead = true);
bool getCurrentMsg(std::string &cid, std::string &mid);
bool getCurrentMsg(RsPeerId &cid, RsMessageId &mid);
void setMsgAsReadUnread(const QList<int> &Rows, bool read);
void setMsgStar(const QList<int> &Rows, bool mark);
@ -140,7 +141,7 @@ private:
void setToolbarButtonStyle(Qt::ToolButtonStyle style);
void fillQuickView();
void closeTab(const std::string &msgId);
void closeTab(const RsMessageId &msgId);
bool inProcessSettings;
bool inChange;
@ -148,7 +149,7 @@ private:
enum { LIST_NOTHING, LIST_BOX, LIST_QUICKVIEW } listMode;
std::string mCurrMsgId;
RsMessageId mCurrMsgId;
// timer and index for showing message
QTimer *timer;

View File

@ -417,7 +417,7 @@ void NewsFeed::testFeeds(uint notifyFlags)
for (msgIt = msgList.begin(); msgIt != msgList.end(); ++msgIt) {
if (fi.mId1.empty()) {
/* store first message */
fi.mId1 = msgIt->msgId;
fi.mId1 = msgIt->msgId.toStdString();
}
if (msgIt->msgflags & RS_MSG_TRASH) {
@ -426,7 +426,7 @@ void NewsFeed::testFeeds(uint notifyFlags)
if ((msgIt->msgflags & RS_MSG_BOXMASK) == RS_MSG_INBOX) {
/* take message from inbox */
fi.mId1 = msgIt->msgId;
fi.mId1 = msgIt->msgId.toStdString();
break;
}
}

View File

@ -55,7 +55,7 @@ private:
uint32_t mFeedId;
RsPeerId mPeerId;
std::string mMsgId;
RsMessageId mMsgId;
bool mIsHome;

View File

@ -57,6 +57,7 @@
#include "textformat.h"
#include "util/misc.h"
#include "util/DateTime.h"
#include "util/radix64.h"
#include "TagsMenu.h"
#include "gui/common/TagDefs.h"
#include "gui/connect/ConfCertDialog.h"
@ -866,16 +867,16 @@ static void calculateGroupsOfSslIds(const std::list<RsGroupInfo> &existingGroupI
}
}
MessageComposer *MessageComposer::newMsg(const std::string &msgId /* = ""*/)
MessageComposer *MessageComposer::newMsg(const RsMessageId &msgId)
{
MessageComposer *msgComposer = new MessageComposer();
msgComposer->addEmptyRecipient();
if (msgId.empty() == false) {
if (msgId.isNull() == false) {
// fill existing message
MessageInfo msgInfo;
if (!rsMsgs->getMessage(msgId, msgInfo)) {
if (!rsMsgs->getMessage(RsMessageId(msgId), msgInfo)) {
std::cerr << "MessageComposer::newMsg() Couldn't find Msg" << std::endl;
delete msgComposer;
return NULL;
@ -972,7 +973,7 @@ MessageComposer *MessageComposer::newMsg(const std::string &msgId /* = ""*/)
}
MsgTagInfo tagInfo;
rsMsgs->getMessageTag(msgId, tagInfo);
rsMsgs->getMessageTag(RsMessageId(msgId), tagInfo);
msgComposer->m_tagIds = tagInfo.tagIds;
msgComposer->showTagLabels();
@ -1093,7 +1094,7 @@ void MessageComposer::setQuotedMsg(const QString &msg, const QString &header)
ui.msgText->setFocus( Qt::OtherFocusReason );
}
MessageComposer *MessageComposer::replyMsg(const std::string &msgId, bool all)
MessageComposer *MessageComposer::replyMsg(const RsMessageId &msgId, bool all)
{
MessageInfo msgInfo;
if (!rsMsgs->getMessage(msgId, msgInfo)) {
@ -1156,7 +1157,7 @@ MessageComposer *MessageComposer::replyMsg(const std::string &msgId, bool all)
return msgComposer;
}
MessageComposer *MessageComposer::forwardMsg(const std::string &msgId)
MessageComposer *MessageComposer::forwardMsg(const RsMessageId &msgId)
{
MessageInfo msgInfo;
if (!rsMsgs->getMessage(msgId, msgInfo)) {
@ -1252,10 +1253,6 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox)
// needed to send system flags with reply
mi.msgflags = msgFlags;
QString text;
RsHtml::optimizeHtml(ui.msgText, text);
mi.body().assign( text.toUtf8().constData() );
/* check for existing title */
if (bDraftbox == false && mi.header().subject().empty()) {
if (QMessageBox::warning(this, tr("RetroShare"), tr("Do you want to send the message without a subject ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
@ -1265,18 +1262,48 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox)
}
int filesCount = ui.msgFileList->topLevelItemCount();
if( filesCount == 0){
mi.header().contentType().set("text/plain");
mi.body().assign( ui.msgText->toPlainText().toStdString() );
// QString text;
// RsHtml::optimizeHtml(ui.msgText, text);
// mi.body().assign( text.toUtf8().constData() );
}
else{
mi.header().contentType().set("multipart/mixed");
mimetic::MimeEntity * textBody = new mimetic::MimeEntity;
textBody->header().contentType().set( "text/plain" );
textBody->body().assign( ui.msgText->toPlainText().toStdString() );
mimetic::MimeEntityList & parts = mi.body().parts();
parts.push_back( textBody );
for (int i = 0; i < filesCount; i++) {
QTreeWidgetItem *item = ui.msgFileList->topLevelItem(i);
if (item->checkState(COLUMN_FILE_CHECKED)) {
RsFileHash hash ( item->text(COLUMN_FILE_HASH).toStdString() );
for(std::list<FileInfo>::iterator it = _recList.begin(); it != _recList.end(); it++) {
if (it->hash == hash) {
// MIME FIXME: mi.files.push_back(*it);
FileInfo fInfo = *it;
if ( fInfo.hash == hash) {
std::ifstream attachmentStream( fInfo.path.c_str() );
if( !attachmentStream.good()){
QMessageBox::warning(this, tr("RetroShare"), tr("Cannot open file to attach: ") + QString::fromStdString( fInfo.fname ) );
return false;
}
std::string attachmentString((std::istreambuf_iterator<char>(attachmentStream)), std::istreambuf_iterator<char>());
mimetic::MimeEntity * attachment = new mimetic::MimeEntity;
std::string contentType = std::string( "application/octet-stream; name=" ) + fInfo.fname;
attachment->header().contentType().set( contentType );
attachment->header().contentTransferEncoding().set( "base64" );
std::string base64Attachment;
Radix64::encode( attachmentString.c_str(), attachmentString.length(), base64Attachment );
attachment->body().assign( base64Attachment );
parts.push_back( attachment );
break;
}
}
}
}
}
/* get the ids from the send list */
std::list<RsPeerId> peers;
@ -1371,12 +1398,10 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox)
if (bDraftbox)
{
mi.header().messageid() = m_sDraftMsgId;
rsMsgs->MessageToDraft(mi, m_msgParentId);
// use new message id
m_sDraftMsgId = mi.header().messageid().str();
m_sDraftMsgId = mi.getMessageId();
switch (m_msgType) {
case NORMAL:
@ -1405,29 +1430,29 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox)
return false;
}
if (m_msgParentId.empty() == false) {
if (m_msgParentId.isNull() == false) {
switch (m_msgType) {
case NORMAL:
break;
case REPLY:
rsMsgs->MessageReplied(m_msgParentId, true);
rsMsgs->MessageReplied(RsMessageId(m_msgParentId), true);
break;
case FORWARD:
rsMsgs->MessageForwarded(m_msgParentId, true);
rsMsgs->MessageForwarded(RsMessageId(m_msgParentId), true);
break;
}
}
}
if (mi.header().messageid().str().empty() == false) {
if (mi.getMessageId().isNull() == false) {
MsgTagInfo tagInfo;
rsMsgs->getMessageTag(mi.header().messageid().str(), tagInfo);
rsMsgs->getMessageTag(mi.getMessageId(), tagInfo);
/* insert new tags */
std::list<uint32_t>::iterator tag;
for (tag = m_tagIds.begin(); tag != m_tagIds.end(); tag++) {
if (std::find(tagInfo.tagIds.begin(), tagInfo.tagIds.end(), *tag) == tagInfo.tagIds.end()) {
rsMsgs->setMessageTag(mi.header().messageid().str(), *tag, true);
rsMsgs->setMessageTag(mi.getMessageId(), *tag, true);
} else {
tagInfo.tagIds.remove(*tag);
}
@ -1435,7 +1460,7 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox)
/* remove deleted tags */
for (tag = tagInfo.tagIds.begin(); tag != tagInfo.tagIds.end(); tag++) {
rsMsgs->setMessageTag(mi.header().messageid().str(), *tag, false);
rsMsgs->setMessageTag(mi.getMessageId(), *tag, false);
}
}
ui.msgText->document()->setModified(false);
@ -2404,6 +2429,7 @@ void MessageComposer::fileHashingFinished(QList<HashedFile> hashedFiles)
QList<HashedFile>::iterator it;
for (it = hashedFiles.begin(); it != hashedFiles.end(); ++it) {
FileInfo info;
info.path = it->filepath.toUtf8().constData();
info.fname = it->filename.toUtf8().constData();
info.hash = it->hash;
info.size = it->size;

View File

@ -58,9 +58,9 @@ public:
static void recommendFriend(const std::list <RsPeerId> &sslIds, const RsPeerId &to = RsPeerId(), const QString &msg = "", bool autoSend = false);
static void sendConnectAttemptMsg(const RsPgpId &gpgId, const RsPeerId &sslId, const QString &sslName);
static MessageComposer *newMsg(const std::string &msgId = "");
static MessageComposer *replyMsg(const std::string &msgId, bool all);
static MessageComposer *forwardMsg(const std::string &msgId);
static MessageComposer *newMsg(const RsMessageId &msgId = RsMessageId());
static MessageComposer *replyMsg(const RsMessageId &msgId, bool all);
static MessageComposer *forwardMsg(const RsMessageId &msgId);
/* worker fns */
void setFileList(const std::list<DirDetails>&);
@ -208,8 +208,8 @@ private:
QHash<QString, QString> autoLinkTitleDictionary;
QHash<QString, int> autoLinkTargetDictionary;
std::string m_msgParentId; // parent message id
std::string m_sDraftMsgId; // existing message id
RsMessageId m_msgParentId; // parent message id
RsMessageId m_sDraftMsgId; // existing message id
enumMessageType m_msgType;
std::list<uint32_t> m_tagIds;
QList<QLabel*> tagLabels;

View File

@ -86,14 +86,14 @@ protected:
uint msgFlags;
};
MessageWidget *MessageWidget::openMsg(const std::string &msgId, bool window)
MessageWidget *MessageWidget::openMsg(const RsMessageId &msgId, bool window)
{
if (msgId.empty()) {
if (msgId.isNull()) {
return NULL;
}
MessageInfo msgInfo;
if (!rsMsgs->getMessage(msgId, msgInfo)) {
if (!rsMsgs->getMessage(RsMessageId(msgId), msgInfo)) {
std::cerr << "MessageWidget::openMsg() Couldn't find Msg" << std::endl;
return NULL;
}
@ -300,7 +300,7 @@ void MessageWidget::togglefileview()
void MessageWidget::getcurrentrecommended()
{
MessageInfo msgInfo;
if (rsMsgs->getMessage(currMsgId, msgInfo) == false) {
if (rsMsgs->getMessage(RsMessageId(currMsgId), msgInfo) == false) {
return;
}
@ -343,7 +343,7 @@ void MessageWidget::getallrecommended()
{
/* get Message */
MessageInfo msgInfo;
if (rsMsgs->getMessage(currMsgId, msgInfo) == false) {
if (rsMsgs->getMessage(RsMessageId(currMsgId), msgInfo) == false) {
return;
}
@ -376,7 +376,7 @@ void MessageWidget::messagesChanged()
/* test Message */
MessageInfo msgInfo;
if (rsMsgs->getMessage(currMsgId, msgInfo) == false) {
if (rsMsgs->getMessage(RsMessageId(currMsgId), msgInfo) == false) {
/* messages was removed */
if (isWindow) {
window()->close();
@ -404,12 +404,12 @@ void MessageWidget::showTagLabels()
{
clearTagLabels();
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
return;
}
MsgTagInfo tagInfo;
rsMsgs->getMessageTag(currMsgId, tagInfo);
rsMsgs->getMessageTag(RsMessageId(currMsgId), tagInfo);
if (tagInfo.tagIds.empty() == false) {
ui.tagsLabel->setVisible(true);
@ -442,7 +442,7 @@ void MessageWidget::refill()
//fill(msg_id) ;
}
void MessageWidget::fill(const std::string &msgId)
void MessageWidget::fill(const RsMessageId &msgId)
{
// if (currMsgId == msgId) {
// // message doesn't changed
@ -453,7 +453,7 @@ void MessageWidget::fill(const std::string &msgId)
currMsgId = msgId;
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
/* blank it */
ui.dateText-> setText("");
ui.toText->setText("");
@ -483,33 +483,11 @@ void MessageWidget::fill(const std::string &msgId)
clearTagLabels();
MessageInfo msgInfo;
if (rsMsgs->getMessage(currMsgId, msgInfo) == false) {
if (rsMsgs->getMessage(RsMessageId(currMsgId), msgInfo) == false) {
std::cerr << "MessageWidget::fill() Couldn't find Msg" << std::endl;
return;
}
// MIME FIXME: Should be real attachments
#if 0
const std::list<FileInfo> &recList = msgInfo.files;
std::list<FileInfo>::const_iterator it;
ui.msgList->clear();
QList<QTreeWidgetItem*> items;
for (it = recList.begin(); it != recList.end(); it++) {
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(COLUMN_FILE_NAME, QString::fromUtf8(it->fname.c_str()));
item->setText(COLUMN_FILE_SIZE, QString::number(it->size));
item->setText(COLUMN_FILE_HASH, QString::fromStdString(it->hash.toStdString()));
/* add to the list */
items.append(item);
}
/* add the items in! */
ui.msgList->insertTopLevelItems(0, items);
#endif
/* iterate through the sources */
RetroShareLink link;
QString text;
@ -625,12 +603,61 @@ void MessageWidget::fill(const std::string &msgId)
ui.subjectText->setText(QString::fromUtf8(msgInfo.header().subject().c_str()));
}
std::string body = msgInfo.body().data();
unsigned int filecount = 0;
std::string body;
if( msgInfo.header().contentType().str() == "multipart/mixed" ){
QList<QTreeWidgetItem*> items;
mimetic::MimeEntityList & parts = msgInfo.body().parts();
filecount = parts.size() - 1; // first part will be the text body
for( mimetic::MimeEntityList::const_iterator it = parts.begin(); it != parts.end(); it++ ){
mimetic::MimeEntity * part = *it;
if( part->header().contentType().type() == "text" ){
body = part->body().data();
}
else if( part->header().contentType().type() == "application" ){
part->header().contentType().param( "name" );
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(COLUMN_FILE_NAME, QString::fromUtf8( part->header().contentType().param( "name" ).c_str() ));
items.append(item);
}
}
ui.msgList->insertTopLevelItems(0, items);
}
else if( msgInfo.header().contentType().type() == "multipart/alternative" ){
// MIME FIXME:
}
else if( msgInfo.header().contentType().type() == "text" ){
body = msgInfo.body().data();
}
// MIME FIXME: Should be real attachments
#if 0
const std::list<FileInfo> &recList = msgInfo.files;
std::list<FileInfo>::const_iterator it;
ui.msgList->clear();
QList<QTreeWidgetItem*> items;
for (it = recList.begin(); it != recList.end(); it++) {
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(COLUMN_FILE_NAME, QString::fromUtf8(it->fname.c_str()));
item->setText(COLUMN_FILE_SIZE, QString::number(it->size));
item->setText(COLUMN_FILE_HASH, QString::fromStdString(it->hash.toStdString()));
/* add to the list */
items.append(item);
}
/* add the items in! */
ui.msgList->insertTopLevelItems(0, items);
#endif
text = RsHtmlMsg(msgInfo.msgflags).formatText(ui.msgText->document(), QString::fromUtf8( body.c_str()), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS | RSHTML_FORMATTEXT_REPLACE_LINKS );
ui.msgText->resetImagesStatus(Settings->getMsgLoadEmbeddedImages() || (msgInfo.msgflags & RS_MSG_LOAD_EMBEDDED_IMAGES));
ui.msgText->setHtml(text);
// MIME FIXME: ui.filesText->setText(QString("(%1 %2)").arg(msgInfo.count).arg(msgInfo.count == 1 ? tr("File") : tr("Files")));
ui.filesText->setText(QString("(%1 %2)").arg(filecount).arg(filecount == 1 ? tr("File") : tr("Files")));
if (msgInfo.msgflags & RS_MSG_ENCRYPTED) {
ui.decryptFrame->show();
@ -715,7 +742,7 @@ void MessageWidget::reply()
{
/* put msg on msgBoard, and switch to it. */
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
return;
}
@ -734,7 +761,7 @@ void MessageWidget::replyAll()
{
/* put msg on msgBoard, and switch to it. */
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
return;
}
@ -753,7 +780,7 @@ void MessageWidget::forward()
{
/* put msg on msgBoard, and switch to it. */
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
return;
}
@ -787,7 +814,7 @@ void MessageWidget::anchorClicked(const QUrl &url)
void MessageWidget::loadImagesAlways()
{
if (currMsgId.empty()) {
if (currMsgId.isNull()) {
return;
}
@ -801,15 +828,15 @@ void MessageWidget::decrypt()
}
// Force refill
std::string msgId = currMsgId;
RsMessageId msgId = currMsgId;
currMsgId.clear();
fill(msgId);
}
bool MessageWidget::decryptMsg(const std::string &msgId)
bool MessageWidget::decryptMsg(const RsMessageId &msgId)
{
if (msgId.empty()) {
if (msgId.isNull()) {
return false;
}

View File

@ -24,6 +24,8 @@
#include <QWidget>
#include "ui_MessageWidget.h"
#include <retroshare/rsmsgs.h>
class QToolButton;
class QAction;
@ -48,18 +50,18 @@ public:
MessageWidget(bool controlled, QWidget *parent = 0, Qt::WindowFlags flags = 0);
~MessageWidget();
static MessageWidget *openMsg(const std::string &msgId, bool window);
static MessageWidget *openMsg(const RsMessageId &msgId, bool window);
std::string msgId() { return currMsgId; }
RsMessageId msgId() { return currMsgId; }
void connectAction(enumActionType actionType, QToolButton* button);
void connectAction(enumActionType actionType, QAction* action);
void fill(const std::string &msgId);
void fill(const RsMessageId &msgId);
void processSettings(const QString &settingsGroup, bool load);
QString subject(bool noEmpty);
static bool decryptMsg(const std::string &msgId);
static bool decryptMsg(const RsMessageId &msgId);
private slots:
void reply();
@ -90,7 +92,7 @@ private:
bool isControlled;
bool isWindow;
std::string currMsgId;
RsMessageId currMsgId;
unsigned int currMsgFlags;
QList<QLabel*> tagLabels;

View File

@ -162,7 +162,7 @@ void MessageWindow::tagAboutToShow()
// activate actions
MsgTagInfo tagInfo;
rsMsgs->getMessageTag(msgWidget->msgId(), tagInfo);
rsMsgs->getMessageTag(RsMessageId(msgWidget->msgId()), tagInfo);
menu->activateActions(tagInfo.tagIds);
}
@ -173,7 +173,7 @@ void MessageWindow::tagRemoveAll()
return;
}
rsMsgs->setMessageTag(msgWidget->msgId(), 0, false);
rsMsgs->setMessageTag(RsMessageId(msgWidget->msgId()), 0, false);
}
void MessageWindow::tagSet(int tagId, bool set)
@ -186,7 +186,7 @@ void MessageWindow::tagSet(int tagId, bool set)
return;
}
rsMsgs->setMessageTag(msgWidget->msgId(), tagId, set);
rsMsgs->setMessageTag(RsMessageId(msgWidget->msgId()), tagId, set);
}
void MessageWindow::setupFileActions()