]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/cli/Manager.java
Exit on timeout when receiving
[signal-cli] / src / main / java / cli / Manager.java
index b745988b5b1ee945c9ae223d10e30f75dc90f63a..acaa1a0c76492560c7866f568f0abb56c59458b3 100644 (file)
@@ -1,16 +1,16 @@
 /**
  * Copyright (C) 2015 AsamK
- * <p>
+ *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- * <p>
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * <p>
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -35,6 +35,8 @@ import org.whispersystems.textsecure.api.messages.TextSecureContent;
 import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
 import org.whispersystems.textsecure.api.push.TextSecureAddress;
 import org.whispersystems.textsecure.api.push.TrustStore;
+import org.whispersystems.textsecure.api.util.InvalidNumberException;
+import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 
 import java.io.*;
 import java.util.List;
@@ -166,31 +168,58 @@ public class Manager {
                 axolotlStore, Optional.<TextSecureMessageSender.EventListener>absent());
     }
 
-    public TextSecureContent receiveMessage() throws IOException, InvalidVersionException {
+    public TextSecureContent decryptMessage(TextSecureEnvelope envelope) {
+        TextSecureCipher cipher = new TextSecureCipher(new TextSecureAddress(username), axolotlStore);
+        try {
+            return cipher.decrypt(envelope);
+        } catch (Exception e) {
+            // TODO handle all exceptions
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public void handleEndSession(String source) {
+        axolotlStore.deleteAllSessions(source);
+    }
+
+    public interface ReceiveMessageHandler {
+        void handleMessage(TextSecureEnvelope envelope);
+    }
+
+    public void receiveMessages(int timeoutSeconds, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException {
         TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey);
         TextSecureMessagePipe messagePipe = null;
 
         try {
             messagePipe = messageReceiver.createMessagePipe();
 
-            TextSecureEnvelope envelope;
-            try {
-                envelope = messagePipe.read(5, TimeUnit.SECONDS);
-            } catch (TimeoutException e) {
-                return null;
+            while (true) {
+                TextSecureEnvelope envelope;
+                try {
+                    envelope = messagePipe.read(timeoutSeconds, TimeUnit.SECONDS);
+                    handler.handleMessage(envelope);
+                } catch (TimeoutException e) {
+                    if (returnOnTimeout)
+                        return;
+                } catch (InvalidVersionException e) {
+                    System.out.println("Ignoring error: " + e.getMessage());
+                }
+                save();
             }
-            TextSecureCipher cipher = new TextSecureCipher(new TextSecureAddress(username), axolotlStore);
-            TextSecureContent message = null;
-            try {
-                message = cipher.decrypt(envelope);
-            } catch (Exception e) {
-                // TODO handle all exceptions
-                e.printStackTrace();
-            }
-            return message;
         } finally {
             if (messagePipe != null)
                 messagePipe.shutdown();
         }
     }
+
+    public String canonicalizeNumber(String number) throws InvalidNumberException {
+        String localNumber = username;
+        return PhoneNumberFormatter.formatNumber(number, localNumber);
+    }
+
+    protected TextSecureAddress getPushAddress(String number) throws InvalidNumberException {
+        String e164number = canonicalizeNumber(number);
+        return new TextSecureAddress(e164number);
+    }
 }