+ envelope = messagePipe.read(timeout, unit, new SignalServiceMessagePipe.MessagePipeCallback() {
+ @Override
+ public void onMessage(SignalServiceEnvelope envelope) {
+ // store message on disk, before acknowledging receipt to the server
+ try {
+ File cacheFile = getMessageCacheFile(envelope.getSource(), now, envelope.getTimestamp());
+ storeEnvelope(envelope, cacheFile);
+ } catch (IOException e) {
+ System.err.println("Failed to store encrypted message in disk cache, ignoring: " + e.getMessage());
+ }
+ }
+ });
+ } catch (TimeoutException e) {
+ if (returnOnTimeout)
+ return;
+ continue;
+ } catch (InvalidVersionException e) {
+ System.err.println("Ignoring error: " + e.getMessage());
+ continue;
+ }
+ if (!envelope.isReceipt()) {
+ try {
+ content = decryptMessage(envelope);
+ } catch (Exception e) {
+ exception = e;
+ }
+ handleMessage(envelope, content, ignoreAttachments);
+ }
+ save();
+ handler.handleMessage(envelope, content, exception);
+ if (exception == null || !(exception instanceof org.whispersystems.libsignal.UntrustedIdentityException)) {
+ File cacheFile = null;
+ try {
+ cacheFile = getMessageCacheFile(envelope.getSource(), now, envelope.getTimestamp());
+ Files.delete(cacheFile.toPath());
+ // Try to delete directory if empty
+ new File(getMessageCachePath()).delete();
+ } catch (IOException e) {
+ System.err.println("Failed to delete cached message file “" + cacheFile + "”: " + e.getMessage());
+ }
+ }
+ }
+ } finally {
+ if (messagePipe != null) {
+ messagePipe.shutdown();
+ messagePipe = null;
+ }
+ }
+ }
+
+ private void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, boolean ignoreAttachments) {
+ if (content != null) {
+ if (content.getDataMessage().isPresent()) {
+ SignalServiceDataMessage message = content.getDataMessage().get();
+ handleSignalServiceDataMessage(message, false, envelope.getSource(), username, ignoreAttachments);
+ }
+ if (content.getSyncMessage().isPresent()) {
+ SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
+ if (syncMessage.getSent().isPresent()) {
+ SignalServiceDataMessage message = syncMessage.getSent().get().getMessage();
+ handleSignalServiceDataMessage(message, true, envelope.getSource(), syncMessage.getSent().get().getDestination().get(), ignoreAttachments);
+ }
+ if (syncMessage.getRequest().isPresent()) {
+ RequestMessage rm = syncMessage.getRequest().get();
+ if (rm.isContactsRequest()) {
+ try {
+ sendContacts();
+ sendVerifiedMessage();
+ } catch (UntrustedIdentityException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (rm.isGroupsRequest()) {