1 package org
.asamk
.signal
.manager
.util
;
3 import org
.slf4j
.Logger
;
4 import org
.slf4j
.LoggerFactory
;
5 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
6 import org
.whispersystems
.signalservice
.api
.push
.ServiceId
;
7 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
8 import org
.whispersystems
.signalservice
.api
.util
.UuidUtil
;
9 import org
.whispersystems
.signalservice
.internal
.push
.Envelope
;
11 import java
.io
.DataInputStream
;
12 import java
.io
.DataOutputStream
;
14 import java
.io
.FileInputStream
;
15 import java
.io
.FileOutputStream
;
16 import java
.io
.IOException
;
17 import java
.util
.Optional
;
19 public class MessageCacheUtils
{
21 private final static Logger logger
= LoggerFactory
.getLogger(MessageCacheUtils
.class);
23 final static int CURRENT_VERSION
= 9;
25 public static SignalServiceEnvelope
loadEnvelope(File file
) throws IOException
{
26 try (var f
= new FileInputStream(file
)) {
27 var in = new DataInputStream(f
);
28 var version
= in.readInt();
29 logger
.trace("Reading cached envelope file with version {} (current: {})", version
, CURRENT_VERSION
);
30 if (version
> CURRENT_VERSION
) {
31 logger
.warn("Unsupported envelope version {} (current: {})", version
, CURRENT_VERSION
);
32 // Unsupported envelope version
36 final var serverReceivedTimestamp
= in.readLong();
37 final var envelope
= Envelope
.ADAPTER
.decode(in.readAllBytes());
38 return new SignalServiceEnvelope(envelope
, serverReceivedTimestamp
);
40 var type
= in.readInt();
41 var source
= in.readUTF();
42 ServiceId sourceServiceId
= null;
44 sourceServiceId
= ServiceId
.parseOrNull(in.readUTF());
46 var sourceDevice
= in.readInt();
48 // read legacy relay field
51 String destinationUuid
= null;
53 destinationUuid
= in.readUTF();
55 var timestamp
= in.readLong();
56 byte[] content
= null;
57 var contentLen
= in.readInt();
59 content
= new byte[contentLen
];
60 in.readFully(content
);
62 var legacyMessageLen
= in.readInt();
63 if (legacyMessageLen
> 0) {
64 byte[] legacyMessage
= new byte[legacyMessageLen
];
65 in.readFully(legacyMessage
);
67 long serverReceivedTimestamp
= 0;
70 serverReceivedTimestamp
= in.readLong();
76 long serverDeliveredTimestamp
= 0;
78 serverDeliveredTimestamp
= in.readLong();
80 boolean isUrgent
= true;
82 isUrgent
= in.readBoolean();
84 boolean isStory
= true;
86 isStory
= in.readBoolean();
88 String updatedPni
= null;
90 updatedPni
= in.readUTF();
92 Optional
<SignalServiceAddress
> addressOptional
= sourceServiceId
== null
94 : Optional
.of(new SignalServiceAddress(sourceServiceId
, source
));
95 return new SignalServiceEnvelope(type
,
100 serverReceivedTimestamp
,
101 serverDeliveredTimestamp
,
103 destinationUuid
== null ? UuidUtil
.UNKNOWN_UUID
.toString() : destinationUuid
,
107 updatedPni
== null ?
"" : updatedPni
);
112 public static void storeEnvelope(SignalServiceEnvelope envelope
, File file
) throws IOException
{
113 try (var f
= new FileOutputStream(file
)) {
114 try (var out
= new DataOutputStream(f
)) {
115 out
.writeInt(CURRENT_VERSION
); // version
116 out
.writeLong(envelope
.getServerDeliveredTimestamp());
117 envelope
.getProto().encode(out
);