@@ -40,14 +40,15 @@ class CMessage
40
40
std::vector<unsigned char > vchMessageType;
41
41
std::vector<unsigned char > vchMessage;
42
42
std::vector<unsigned char > vchSenderFQDN;
43
+ bool fKeepLast ;
43
44
44
45
CMessage ()
45
46
{
46
47
SetNull ();
47
48
}
48
49
49
- CMessage (const int & version, const std::vector<unsigned char >& type, const std::vector<unsigned char >& message, const std::vector<unsigned char >& sender)
50
- : nMessageVersion(version), vchMessageType(type), vchMessage(message), vchSenderFQDN(sender) {}
50
+ CMessage (const int & version, const std::vector<unsigned char >& type, const std::vector<unsigned char >& message, const std::vector<unsigned char >& sender, bool keeplast )
51
+ : nMessageVersion(version), vchMessageType(type), vchMessage(message), vchSenderFQDN(sender), fKeepLast (keeplast) {}
51
52
52
53
CMessage (const std::vector<unsigned char >& vchData)
53
54
{
@@ -63,6 +64,7 @@ class CMessage
63
64
READWRITE (vchMessageType);
64
65
READWRITE (vchMessage);
65
66
READWRITE (vchSenderFQDN);
67
+ READWRITE (fKeepLast );
66
68
}
67
69
68
70
void SetNull ()
@@ -71,6 +73,7 @@ class CMessage
71
73
vchMessageType.clear ();
72
74
vchMessage.clear ();
73
75
vchSenderFQDN.clear ();
76
+ fKeepLast = false ;
74
77
}
75
78
76
79
inline bool IsNull () const { return (nMessageVersion == -1 ); }
@@ -81,6 +84,7 @@ class CMessage
81
84
vchMessageType = b.vchMessageType ;
82
85
vchMessage = b.vchMessage ;
83
86
vchSenderFQDN = b.vchSenderFQDN ;
87
+ fKeepLast = b.fKeepLast ;
84
88
return *this ;
85
89
}
86
90
@@ -143,9 +147,9 @@ std::string CUnsignedVGPMessage::ToString() const
143
147
}
144
148
145
149
bool CUnsignedVGPMessage::EncryptMessage (const std::vector<unsigned char >& vchType, const std::vector<unsigned char >& vchMessage, const std::vector<unsigned char >& vchSenderFQDN,
146
- const std::vector<std::vector<unsigned char >>& vvchPubKeys, std::string& strErrorMessage)
150
+ const std::vector<std::vector<unsigned char >>& vvchPubKeys, const bool fKeepLast , std::string& strErrorMessage)
147
151
{
148
- CMessage message (1 , vchType, vchMessage, vchSenderFQDN);
152
+ CMessage message (1 , vchType, vchMessage, vchSenderFQDN, fKeepLast );
149
153
std::vector<unsigned char > vchData;
150
154
message.Serialize (vchData);
151
155
std::vector<unsigned char > vchCipherText;
@@ -158,7 +162,7 @@ bool CUnsignedVGPMessage::EncryptMessage(const std::vector<unsigned char>& vchTy
158
162
return true ;
159
163
}
160
164
161
- bool CUnsignedVGPMessage::DecryptMessage (const std::array<char , 32 >& arrPrivateSeed, std::vector<unsigned char >& vchType, std::vector<unsigned char >& vchMessage, std::vector<unsigned char >& vchSenderFQDN, std::string& strErrorMessage)
165
+ bool CUnsignedVGPMessage::DecryptMessage (const std::array<char , 32 >& arrPrivateSeed, std::vector<unsigned char >& vchType, std::vector<unsigned char >& vchMessage, std::vector<unsigned char >& vchSenderFQDN, bool & fKeepLast , std::string& strErrorMessage)
162
166
{
163
167
if (!fEncrypted )
164
168
return false ;
@@ -177,6 +181,7 @@ bool CUnsignedVGPMessage::DecryptMessage(const std::array<char, 32>& arrPrivateS
177
181
vchType = message.vchMessageType ;
178
182
vchMessage = message.vchMessage ;
179
183
vchSenderFQDN = message.vchSenderFQDN ;
184
+ fKeepLast = message.fKeepLast ;
180
185
return true ;
181
186
}
182
187
@@ -229,6 +234,16 @@ std::vector<unsigned char> CUnsignedVGPMessage::SenderFQDN()
229
234
return message.vchSenderFQDN ;
230
235
}
231
236
237
+ bool CUnsignedVGPMessage::KeepLast ()
238
+ {
239
+ bool keepLast = false ;
240
+ if (fEncrypted )
241
+ return keepLast;
242
+
243
+ CMessage message (vchMessageData);
244
+ return message.fKeepLast ;
245
+ }
246
+
232
247
CVGPMessage::CVGPMessage (CUnsignedVGPMessage& unsignedMessage)
233
248
{
234
249
unsignedMessage.Serialize (vchMsg);
@@ -485,11 +500,12 @@ bool DecryptMessage(CUnsignedVGPMessage& unsignedMessage)
485
500
std::string strErrorMessage = " " ;
486
501
if (GetSharedPrivateSeed (link , seed, strErrorMessage))
487
502
{
503
+ bool fKeepLast ;
488
504
std::vector<unsigned char > vchType, vchMessage, vchSenderFQDN;
489
- if (unsignedMessage.DecryptMessage (seed, vchType, vchMessage, vchSenderFQDN, strErrorMessage))
505
+ if (unsignedMessage.DecryptMessage (seed, vchType, vchMessage, vchSenderFQDN, fKeepLast , strErrorMessage))
490
506
{
491
507
LogPrint (" bdap" , " %s -- Found and decrypted type = %s, message = %s, sender = %s\n " , __func__, stringFromVch (vchType), stringFromVch (vchMessage), stringFromVch (vchSenderFQDN));
492
- CMessage message (1 , vchType, vchMessage, vchSenderFQDN);
508
+ CMessage message (1 , vchType, vchMessage, vchSenderFQDN, fKeepLast );
493
509
unsignedMessage.fEncrypted = false ;
494
510
message.Serialize (unsignedMessage.vchMessageData );
495
511
return true ;
@@ -560,10 +576,11 @@ void GetMyLinkMessages(const uint256& subjectID, std::vector<CUnsignedVGPMessage
560
576
vMessages.push_back (unsignedMessage);
561
577
}
562
578
}
579
+ itr++;
563
580
}
564
581
}
565
582
566
- void GetMyLinkMessagesByType (const std::vector<unsigned char >& vchType, const std::vector<unsigned char >& vchRecipientFQDN, std::vector<CVGPMessage>& vMessages)
583
+ void GetMyLinkMessagesByType (const std::vector<unsigned char >& vchType, const std::vector<unsigned char >& vchRecipientFQDN, std::vector<CVGPMessage>& vMessages, bool & fKeepLast )
567
584
{
568
585
LOCK (cs_mapMyVGPMessages);
569
586
std::map<uint256, CVGPMessage>::iterator itr = mapMyVGPMessages.begin ();
@@ -577,6 +594,9 @@ void GetMyLinkMessagesByType(const std::vector<unsigned char>& vchType, const st
577
594
}
578
595
if (!unsignedMessage.fEncrypted && (vchType.size () == 0 || vchType == unsignedMessage.Type ()) && unsignedMessage.SenderFQDN () != vchRecipientFQDN)
579
596
{
597
+ if (unsignedMessage.KeepLast ())
598
+ fKeepLast = true ;
599
+
580
600
vMessages.push_back (unsignedMessage);
581
601
}
582
602
itr++;
@@ -598,4 +618,30 @@ void GetMyLinkMessagesBySubjectAndSender(const uint256& subjectID, const std::ve
598
618
}
599
619
itr++;
600
620
}
621
+ }
622
+
623
+ void KeepLastBySender (std::vector<CVGPMessage>& vMessages)
624
+ {
625
+ std::map<std::vector<unsigned char >, std::pair<CVGPMessage, int64_t > > mapFromMessageTime;
626
+ for (const CVGPMessage& message : vMessages)
627
+ {
628
+ CUnsignedVGPMessage unsignedMessage (message.vchMsg );
629
+ if (!unsignedMessage.fEncrypted )
630
+ {
631
+ std::map<std::vector<unsigned char >, std::pair<CVGPMessage, int64_t > >::iterator itFind = mapFromMessageTime.find (unsignedMessage.SenderFQDN ());
632
+ if (itFind == mapFromMessageTime.end ()) {
633
+ mapFromMessageTime[unsignedMessage.SenderFQDN ()] = std::make_pair (message, unsignedMessage.nTimeStamp );
634
+ }
635
+ else if (unsignedMessage.nTimeStamp > itFind->second .second ) {
636
+ mapFromMessageTime[unsignedMessage.SenderFQDN ()] = std::make_pair (message, unsignedMessage.nTimeStamp );
637
+ }
638
+ }
639
+ }
640
+ vMessages.clear ();
641
+ std::map<std::vector<unsigned char >, std::pair<CVGPMessage, int64_t > >::iterator itr = mapFromMessageTime.begin ();
642
+ while (itr != mapFromMessageTime.end ())
643
+ {
644
+ vMessages.push_back (itr->second .first );
645
+ itr++;
646
+ }
601
647
}
0 commit comments