aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel@gultsch.de>2016-07-14 17:05:43 +0200
committerChristian Schneppe <christian@pix-art.de>2016-07-17 15:22:19 +0200
commit47f559310b72a23d8049af5a423f353e8aea841e (patch)
tree97fe182aea15e9116938c9a45308314ea7bdbf59 /src/main/java
parent78a60fb85a6b5101f6cee8b4efa156746ac279a3 (diff)
add more error states for stream errors
Diffstat (limited to '')
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Account.java8
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java28
2 files changed, 32 insertions, 4 deletions
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java
index 1707a6a95..8eb555331 100644
--- a/src/main/java/eu/siacs/conversations/entities/Account.java
+++ b/src/main/java/eu/siacs/conversations/entities/Account.java
@@ -107,7 +107,9 @@ public class Account extends AbstractEntity {
TOR_NOT_AVAILABLE(true),
BIND_FAILURE(true),
HOST_UNKNOWN(true),
- REGISTRATION_PLEASE_WAIT(true);
+ REGISTRATION_PLEASE_WAIT(true),
+ STREAM_ERROR(true),
+ POLICY_VIOLATION(true);
private final boolean isError;
@@ -157,8 +159,12 @@ public class Account extends AbstractEntity {
return R.string.account_status_bind_failure;
case HOST_UNKNOWN:
return R.string.account_status_host_unknown;
+ case POLICY_VIOLATION:
+ return R.string.account_status_policy_violation;
case REGISTRATION_PLEASE_WAIT:
return R.string.registration_please_wait;
+ case STREAM_ERROR:
+ return R.string.account_status_stream_error;
default:
return R.string.account_status_unknown;
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 88765c147..a4476c052 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -374,6 +374,12 @@ public class XmppConnection implements Runnable {
this.changeStatus(Account.State.SERVER_NOT_FOUND);
} catch (final SocksSocketFactory.SocksProxyNotFoundException e) {
this.changeStatus(Account.State.TOR_NOT_AVAILABLE);
+ } catch(final StreamErrorHostUnknown e) {
+ this.changeStatus(Account.State.HOST_UNKNOWN);
+ } catch(final StreamErrorPolicyViolation e) {
+ this.changeStatus(Account.State.POLICY_VIOLATION);
+ } catch(final StreamError e) {
+ this.changeStatus(Account.State.STREAM_ERROR);
} catch (final IOException | XmlPullParserException | NoSuchAlgorithmException e) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
this.changeStatus(Account.State.OFFLINE);
@@ -1189,17 +1195,21 @@ public class XmppConnection implements Runnable {
if (streamError == null) {
return;
}
- Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString());
if (streamError.hasChild("conflict")) {
final String resource = account.getResource().split("\\.")[0];
account.setResource(resource + "." + nextRandomId());
Log.d(Config.LOGTAG,
account.getJid().toBareJid() + ": switching resource due to conflict ("
+ account.getResource() + ")");
+ throw new IOException();
} else if (streamError.hasChild("host-unknown")) {
- changeStatus(Account.State.HOST_UNKNOWN);
+ throw new StreamErrorHostUnknown();
+ } else if (streamError.hasChild("policy-violation")) {
+ throw new StreamErrorPolicyViolation();
+ } else {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString());
+ throw new StreamError();
}
- forceCloseSocket();
}
private void sendStartStream() throws IOException {
@@ -1498,6 +1508,18 @@ public class XmppConnection implements Runnable {
}
+ private class StreamErrorHostUnknown extends StreamError {
+
+ }
+
+ private class StreamErrorPolicyViolation extends StreamError {
+
+ }
+
+ private class StreamError extends IOException {
+
+ }
+
public enum Identity {
FACEBOOK,
SLACK,