+ var sourceDevice = in.readInt();
+ if (version == 1) {
+ // read legacy relay field
+ in.readUTF();
+ }
+ String destinationUuid = null;
+ if (version >= 5) {
+ destinationUuid = in.readUTF();
+ }
+ var timestamp = in.readLong();
+ byte[] content = null;
+ var contentLen = in.readInt();
+ if (contentLen > 0) {
+ content = new byte[contentLen];
+ in.readFully(content);
+ }
+ var legacyMessageLen = in.readInt();
+ if (legacyMessageLen > 0) {
+ byte[] legacyMessage = new byte[legacyMessageLen];
+ in.readFully(legacyMessage);
+ }
+ long serverReceivedTimestamp = 0;
+ String uuid = null;
+ if (version >= 2) {
+ serverReceivedTimestamp = in.readLong();
+ uuid = in.readUTF();
+ if ("".equals(uuid)) {
+ uuid = null;
+ }
+ }
+ long serverDeliveredTimestamp = 0;
+ if (version >= 4) {
+ serverDeliveredTimestamp = in.readLong();
+ }
+ boolean isUrgent = true;
+ if (version >= 6) {
+ isUrgent = in.readBoolean();
+ }
+ boolean isStory = true;
+ if (version >= 7) {
+ isStory = in.readBoolean();
+ }
+ String updatedPni = null;
+ if (version >= 8) {
+ updatedPni = in.readUTF();
+ }
+ Optional<SignalServiceAddress> addressOptional = sourceServiceId == null
+ ? Optional.empty()
+ : Optional.of(new SignalServiceAddress(sourceServiceId, source));
+ return new SignalServiceEnvelope(type,
+ addressOptional,
+ sourceDevice,
+ timestamp,
+ content,
+ serverReceivedTimestamp,
+ serverDeliveredTimestamp,
+ uuid,
+ destinationUuid == null ? UuidUtil.UNKNOWN_UUID.toString() : destinationUuid,
+ isUrgent,
+ isStory,
+ null,
+ updatedPni == null ? "" : updatedPni);