more details connection error messages

This commit is contained in:
Daniel Gultsch 2014-03-06 15:11:56 +01:00
parent a73cc24c3f
commit 4edd623a1e
4 changed files with 42 additions and 28 deletions

View file

@ -13,8 +13,6 @@ import eu.siacs.conversations.xmpp.XmppConnection;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.util.JsonReader;
import android.util.Log;
public class Account extends AbstractEntity{ public class Account extends AbstractEntity{
@ -40,6 +38,8 @@ public class Account extends AbstractEntity{
public static final int STATUS_NO_INTERNET = 3; public static final int STATUS_NO_INTERNET = 3;
public static final int STATUS_TLS_ERROR = 4; public static final int STATUS_TLS_ERROR = 4;
public static final int STATUS_SERVER_NOT_FOUND = 5; public static final int STATUS_SERVER_NOT_FOUND = 5;
public static final int STATUS_SERVER_REQUIRES_TLS = 6;
protected String username; protected String username;
protected String server; protected String server;

View file

@ -819,7 +819,11 @@ public class XmppConnectionService extends Service {
disconnect(account); disconnect(account);
} }
if (!account.isOptionSet(Account.OPTION_DISABLED)) { if (!account.isOptionSet(Account.OPTION_DISABLED)) {
account.setXmppConnection(this.createConnection(account)); if (account.getXmppConnection()==null) {
account.setXmppConnection(this.createConnection(account));
}
Thread thread = new Thread(account.getXmppConnection());
thread.start();
} }
if (accountChangedListener != null) if (accountChangedListener != null)
accountChangedListener.onAccountListChangedListener(); accountChangedListener.onAccountListChangedListener();

View file

@ -110,6 +110,10 @@ public class ManageAccountActivity extends XmppActivity {
statusView.setText("no internet"); statusView.setText("no internet");
statusView.setTextColor(0xFFe92727); statusView.setTextColor(0xFFe92727);
break; break;
case Account.STATUS_SERVER_REQUIRES_TLS:
statusView.setText("server requires TLS");
statusView.setTextColor(0xFFe92727);
break;
default: default:
break; break;
} }

View file

@ -7,6 +7,7 @@ import java.math.BigInteger;
import java.net.Socket; import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.cert.CertPathValidatorException;
import java.util.HashSet; import java.util.HashSet;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List; import java.util.List;
@ -66,7 +67,7 @@ public class XmppConnection implements Runnable {
tagReader = new XmlReader(wakeLock); tagReader = new XmlReader(wakeLock);
tagWriter = new TagWriter(); tagWriter = new TagWriter();
} }
protected void changeStatus(int nextStatus) { protected void changeStatus(int nextStatus) {
account.setStatus(nextStatus); account.setStatus(nextStatus);
if (statusListener != null) { if (statusListener != null) {
@ -75,6 +76,7 @@ public class XmppConnection implements Runnable {
} }
protected void connect() { protected void connect() {
Log.d(LOGTAG, "connecting");
try { try {
this.changeStatus(Account.STATUS_CONNECTING); this.changeStatus(Account.STATUS_CONNECTING);
Bundle namePort = DNSHelper.getSRVRecord(account.getServer()); Bundle namePort = DNSHelper.getSRVRecord(account.getServer());
@ -143,6 +145,11 @@ public class XmppConnection implements Runnable {
processStreamError(nextTag); processStreamError(nextTag);
} else if (nextTag.isStart("features")) { } else if (nextTag.isStart("features")) {
processStreamFeatures(nextTag); processStreamFeatures(nextTag);
if ((streamFeatures.getChildren().size() == 1)
&& (streamFeatures.hasChild("starttls"))
&& (!account.isOptionSet(Account.OPTION_USETLS))) {
changeStatus(Account.STATUS_SERVER_REQUIRES_TLS);
}
} else if (nextTag.isStart("proceed")) { } else if (nextTag.isStart("proceed")) {
switchOverToTls(nextTag); switchOverToTls(nextTag);
} else if (nextTag.isStart("success")) { } else if (nextTag.isStart("success")) {
@ -156,12 +163,7 @@ public class XmppConnection implements Runnable {
break; break;
} else if (nextTag.isStart("failure")) { } else if (nextTag.isStart("failure")) {
Element failure = tagReader.readElement(nextTag); Element failure = tagReader.readElement(nextTag);
Log.d(LOGTAG, "read failure element" + failure.toString()); changeStatus(Account.STATUS_UNAUTHORIZED);
account.setStatus(Account.STATUS_UNAUTHORIZED);
if (statusListener != null) {
statusListener.onStatusChanged(account);
}
tagWriter.writeTag(Tag.end("stream"));
} else if (nextTag.isStart("iq")) { } else if (nextTag.isStart("iq")) {
processIq(nextTag); processIq(nextTag);
} else if (nextTag.isStart("message")) { } else if (nextTag.isStart("message")) {
@ -215,10 +217,10 @@ public class XmppConnection implements Runnable {
IqPacket packet = (IqPacket) processPacket(currentTag, PACKET_IQ); IqPacket packet = (IqPacket) processPacket(currentTag, PACKET_IQ);
if (packetCallbacks.containsKey(packet.getId())) { if (packetCallbacks.containsKey(packet.getId())) {
if (packetCallbacks.get(packet.getId()) instanceof OnIqPacketReceived) { if (packetCallbacks.get(packet.getId()) instanceof OnIqPacketReceived) {
((OnIqPacketReceived) packetCallbacks.get(packet.getId())).onIqPacketReceived(account, ((OnIqPacketReceived) packetCallbacks.get(packet.getId()))
packet); .onIqPacketReceived(account, packet);
} }
packetCallbacks.remove(packet.getId()); packetCallbacks.remove(packet.getId());
} else if (this.unregisteredIqListener != null) { } else if (this.unregisteredIqListener != null) {
this.unregisteredIqListener.onIqPacketReceived(account, packet); this.unregisteredIqListener.onIqPacketReceived(account, packet);
@ -230,10 +232,10 @@ public class XmppConnection implements Runnable {
MessagePacket packet = (MessagePacket) processPacket(currentTag, MessagePacket packet = (MessagePacket) processPacket(currentTag,
PACKET_MESSAGE); PACKET_MESSAGE);
String id = packet.getAttribute("id"); String id = packet.getAttribute("id");
if ((id!=null)&&(packetCallbacks.containsKey(id))) { if ((id != null) && (packetCallbacks.containsKey(id))) {
if (packetCallbacks.get(id) instanceof OnMessagePacketReceived) { if (packetCallbacks.get(id) instanceof OnMessagePacketReceived) {
((OnMessagePacketReceived) packetCallbacks.get(id)).onMessagePacketReceived(account, ((OnMessagePacketReceived) packetCallbacks.get(id))
packet); .onMessagePacketReceived(account, packet);
} }
packetCallbacks.remove(id); packetCallbacks.remove(id);
} else if (this.messageListener != null) { } else if (this.messageListener != null) {
@ -246,10 +248,10 @@ public class XmppConnection implements Runnable {
PresencePacket packet = (PresencePacket) processPacket(currentTag, PresencePacket packet = (PresencePacket) processPacket(currentTag,
PACKET_PRESENCE); PACKET_PRESENCE);
String id = packet.getAttribute("id"); String id = packet.getAttribute("id");
if ((id!=null)&&(packetCallbacks.containsKey(id))) { if ((id != null) && (packetCallbacks.containsKey(id))) {
if (packetCallbacks.get(id) instanceof OnPresencePacketReceived) { if (packetCallbacks.get(id) instanceof OnPresencePacketReceived) {
((OnPresencePacketReceived) packetCallbacks.get(id)).onPresencePacketReceived(account, ((OnPresencePacketReceived) packetCallbacks.get(id))
packet); .onPresencePacketReceived(account, packet);
} }
packetCallbacks.remove(id); packetCallbacks.remove(id);
} else if (this.presenceListener != null) { } else if (this.presenceListener != null) {
@ -375,21 +377,23 @@ public class XmppConnection implements Runnable {
} }
}); });
} }
private void sendEnableCarbons() { private void sendEnableCarbons() {
Log.d(LOGTAG,account.getJid()+": enable carbons"); Log.d(LOGTAG, account.getJid() + ": enable carbons");
IqPacket iq = new IqPacket(IqPacket.TYPE_SET); IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
Element enable = new Element("enable"); Element enable = new Element("enable");
enable.setAttribute("xmlns", "urn:xmpp:carbons:2"); enable.setAttribute("xmlns", "urn:xmpp:carbons:2");
iq.addChild(enable); iq.addChild(enable);
this.sendIqPacket(iq, new OnIqPacketReceived() { this.sendIqPacket(iq, new OnIqPacketReceived() {
@Override @Override
public void onIqPacketReceived(Account account, IqPacket packet) { public void onIqPacketReceived(Account account, IqPacket packet) {
if (!packet.hasChild("error")) { if (!packet.hasChild("error")) {
Log.d(LOGTAG,account.getJid()+": successfully enabled carbons"); Log.d(LOGTAG, account.getJid()
+ ": successfully enabled carbons");
} else { } else {
Log.d(LOGTAG,account.getJid()+": error enableing carbons "+packet.toString()); Log.d(LOGTAG, account.getJid()
+ ": error enableing carbons " + packet.toString());
} }
} }
}); });
@ -426,8 +430,9 @@ public class XmppConnection implements Runnable {
public void sendMessagePacket(MessagePacket packet) { public void sendMessagePacket(MessagePacket packet) {
this.sendMessagePacket(packet, null); this.sendMessagePacket(packet, null);
} }
public void sendMessagePacket(MessagePacket packet, OnMessagePacketReceived callback) { public void sendMessagePacket(MessagePacket packet,
OnMessagePacketReceived callback) {
String id = nextRandomId(); String id = nextRandomId();
packet.setAttribute("id", id); packet.setAttribute("id", id);
tagWriter.writeElement(packet); tagWriter.writeElement(packet);
@ -439,8 +444,9 @@ public class XmppConnection implements Runnable {
public void sendPresencePacket(PresencePacket packet) { public void sendPresencePacket(PresencePacket packet) {
this.sendPresencePacket(packet, null); this.sendPresencePacket(packet, null);
} }
public PresencePacket sendPresencePacket(PresencePacket packet, OnPresencePacketReceived callback) { public PresencePacket sendPresencePacket(PresencePacket packet,
OnPresencePacketReceived callback) {
String id = nextRandomId(); String id = nextRandomId();
packet.setAttribute("id", id); packet.setAttribute("id", id);
tagWriter.writeElement(packet); tagWriter.writeElement(packet);