1 package org
.asamk
.signal
.manager
.util
;
3 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
4 import org
.whispersystems
.signalservice
.api
.push
.ServiceId
;
5 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
6 import org
.whispersystems
.signalservice
.api
.util
.UuidUtil
;
8 import java
.io
.DataInputStream
;
9 import java
.io
.DataOutputStream
;
11 import java
.io
.FileInputStream
;
12 import java
.io
.FileOutputStream
;
13 import java
.io
.IOException
;
14 import java
.util
.Optional
;
16 public class MessageCacheUtils
{
18 public static SignalServiceEnvelope
loadEnvelope(File file
) throws IOException
{
19 try (var f
= new FileInputStream(file
)) {
20 var in = new DataInputStream(f
);
21 var version
= in.readInt();
23 // Unsupported envelope version
26 var type
= in.readInt();
27 var source
= in.readUTF();
28 ServiceId sourceServiceId
= null;
30 sourceServiceId
= ServiceId
.parseOrNull(in.readUTF());
32 var sourceDevice
= in.readInt();
34 // read legacy relay field
37 String destinationUuid
= null;
39 destinationUuid
= in.readUTF();
41 var timestamp
= in.readLong();
42 byte[] content
= null;
43 var contentLen
= in.readInt();
45 content
= new byte[contentLen
];
46 in.readFully(content
);
48 var legacyMessageLen
= in.readInt();
49 if (legacyMessageLen
> 0) {
50 byte[] legacyMessage
= new byte[legacyMessageLen
];
51 in.readFully(legacyMessage
);
53 long serverReceivedTimestamp
= 0;
56 serverReceivedTimestamp
= in.readLong();
58 if ("".equals(uuid
)) {
62 long serverDeliveredTimestamp
= 0;
64 serverDeliveredTimestamp
= in.readLong();
66 boolean isUrgent
= true;
68 isUrgent
= in.readBoolean();
70 boolean isStory
= true;
72 isStory
= in.readBoolean();
74 Optional
<SignalServiceAddress
> addressOptional
= sourceServiceId
== null
76 : Optional
.of(new SignalServiceAddress(sourceServiceId
, source
));
77 return new SignalServiceEnvelope(type
,
82 serverReceivedTimestamp
,
83 serverDeliveredTimestamp
,
85 destinationUuid
== null ? UuidUtil
.UNKNOWN_UUID
.toString() : destinationUuid
,
91 public static void storeEnvelope(SignalServiceEnvelope envelope
, File file
) throws IOException
{
92 try (var f
= new FileOutputStream(file
)) {
93 try (var out
= new DataOutputStream(f
)) {
94 out
.writeInt(7); // version
95 out
.writeInt(envelope
.getType());
96 out
.writeUTF(""); // legacy number
97 out
.writeUTF(envelope
.getSourceUuid().isPresent() ? envelope
.getSourceUuid().get() : "");
98 out
.writeInt(envelope
.getSourceDevice());
99 out
.writeUTF(envelope
.getDestinationUuid() == null ?
"" : envelope
.getDestinationUuid());
100 out
.writeLong(envelope
.getTimestamp());
101 if (envelope
.hasContent()) {
102 out
.writeInt(envelope
.getContent().length
);
103 out
.write(envelope
.getContent());
107 out
.writeInt(0); // legacy message
108 out
.writeLong(envelope
.getServerReceivedTimestamp());
109 var uuid
= envelope
.getServerGuid();
110 out
.writeUTF(uuid
== null ?
"" : uuid
);
111 out
.writeLong(envelope
.getServerDeliveredTimestamp());
112 out
.writeBoolean(envelope
.isUrgent());
113 out
.writeBoolean(envelope
.isStory());