aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoriNPUTmice <daniel@gultsch.de>2014-11-18 01:48:16 +0100
committeriNPUTmice <daniel@gultsch.de>2014-11-18 01:48:16 +0100
commit090e6ecf09eb1f60033e2a65575b4f27218e2853 (patch)
treeab7ede353bb250d7cb95be07eebd6b375c76e408
parentd2a4855a1e99c244bb022a959068da5f23d2e6a9 (diff)
better exception handling in XmppConnection.connect. (never return without throwing exception. use finally to release wake lock. use status.server_not_found instead of status.offline when necessary
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java54
1 files changed, 15 insertions, 39 deletions
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 9e6b8baf..f7a86802 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -20,6 +20,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
+import java.net.ConnectException;
import java.net.IDN;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -158,9 +159,7 @@ public class XmppConnection implements Runnable {
Bundle result = DNSHelper.getSRVRecord(account.getServer());
ArrayList<Parcelable> values = result.getParcelableArrayList("values");
if ("timeout".equals(result.getString("error"))) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": dns timeout");
- this.changeStatus(Account.State.OFFLINE);
- return;
+ throw new IOException("timeout in dns");
} else if (values != null) {
int i = 0;
boolean socketError = true;
@@ -200,23 +199,13 @@ public class XmppConnection implements Runnable {
}
}
if (socketError) {
- this.changeStatus(Account.State.SERVER_NOT_FOUND);
- if (wakeLock.isHeld()) {
- try {
- wakeLock.release();
- } catch (final RuntimeException ignored) {
- }
- }
- return;
+ throw new UnknownHostException();
}
} else if (result.containsKey("error")
&& "nosrv".equals(result.getString("error", null))) {
socket = new Socket(account.getServer().getDomainpart(), 5222);
} else {
- Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
- + ": timeout in DNS resolution");
- changeStatus(Account.State.OFFLINE);
- return;
+ throw new IOException("timeout in dns");
}
OutputStream out = socket.getOutputStream();
tagWriter.setOutputStream(out);
@@ -230,9 +219,7 @@ public class XmppConnection implements Runnable {
processStream(nextTag);
break;
} else {
- Log.d(Config.LOGTAG,
- "found unexpected tag: " + nextTag.getName());
- return;
+ throw new IOException("unknown tag on connect");
}
}
if (socket.isConnected()) {
@@ -240,25 +227,15 @@ public class XmppConnection implements Runnable {
}
} catch (UnknownHostException e) {
this.changeStatus(Account.State.SERVER_NOT_FOUND);
- if (wakeLock.isHeld()) {
- try {
- wakeLock.release();
- } catch (final RuntimeException ignored) {
- }
- }
+ } catch (final ConnectException e) {
+ this.changeStatus(Account.State.SERVER_NOT_FOUND);
} catch (final IOException | XmlPullParserException e) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
this.changeStatus(Account.State.OFFLINE);
- if (wakeLock.isHeld()) {
- try {
- wakeLock.release();
- } catch (final RuntimeException ignored) {
- }
- }
} catch (NoSuchAlgorithmException e) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
this.changeStatus(Account.State.OFFLINE);
- Log.d(Config.LOGTAG, "compression exception " + e.getMessage());
+ } finally {
if (wakeLock.isHeld()) {
try {
wakeLock.release();
@@ -266,7 +243,6 @@ public class XmppConnection implements Runnable {
}
}
}
-
}
@Override
@@ -534,7 +510,7 @@ public class XmppConnection implements Runnable {
NoSuchAlgorithmException {
tagReader.readTag(); // read tag close
tagWriter.setOutputStream(new ZLibOutputStream(tagWriter
- .getOutputStream()));
+ .getOutputStream()));
tagReader
.setInputStream(new ZLibInputStream(tagReader.getInputStream()));
@@ -726,23 +702,23 @@ public class XmppConnection implements Runnable {
&& (packet.query().hasChild("password"))) {
IqPacket register = new IqPacket(IqPacket.TYPE_SET);
Element username = new Element("username")
- .setContent(account.getUsername());
+ .setContent(account.getUsername());
Element password = new Element("password")
- .setContent(account.getPassword());
+ .setContent(account.getPassword());
register.query("jabber:iq:register").addChild(username);
register.query().addChild(password);
sendIqPacket(register, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account,
- IqPacket packet) {
+ IqPacket packet) {
if (packet.getType() == IqPacket.TYPE_RESULT) {
account.setOption(Account.OPTION_REGISTER,
false);
changeStatus(Account.State.REGISTRATION_SUCCESSFUL);
} else if (packet.hasChild("error")
&& (packet.findChild("error")
- .hasChild("conflict"))) {
+ .hasChild("conflict"))) {
changeStatus(Account.State.REGISTRATION_CONFLICT);
} else {
changeStatus(Account.State.REGISTRATION_FAILED);
@@ -785,7 +761,7 @@ public class XmppConnection implements Runnable {
stanzasSent = 0;
messageReceipts.clear();
} else if (streamFeatures.hasChild("sm",
- "urn:xmpp:sm:2")) {
+ "urn:xmpp:sm:2")) {
smVersion = 2;
EnablePacket enable = new EnablePacket(smVersion);
tagWriter.writeStanzaAsync(enable);
@@ -906,7 +882,7 @@ public class XmppConnection implements Runnable {
account.setResource(resource + "." + nextRandomId());
Log.d(Config.LOGTAG,
account.getJid().toBareJid() + ": switching resource due to conflict ("
- + account.getResource() + ")");
+ + account.getResource() + ")");
}
}