diff options
Diffstat (limited to 'src/main/java/eu')
10 files changed, 88 insertions, 19 deletions
diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index 40eec0d2..f7a58cb7 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -358,7 +358,8 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT); mXmppConnectionService.sendIqPacket(account, response, null); } else if (packet.hasChild("open", "http://jabber.org/protocol/ibb") - || packet.hasChild("data", "http://jabber.org/protocol/ibb")) { + || packet.hasChild("data", "http://jabber.org/protocol/ibb") + || packet.hasChild("close","http://jabber.org/protocol/ibb")) { mXmppConnectionService.getJingleConnectionManager() .deliverIbbPacket(account, packet); } else if (packet.hasChild("query", "http://jabber.org/protocol/disco#info")) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 189879a6..c908c5cb 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -1271,6 +1271,8 @@ public class ConversationActivity extends XmppActivity } if (isConversationsOverviewVisable() && isConversationsOverviewHideable()) { xmppConnectionService.getNotificationService().setOpenConversation(null); + } else { + xmppConnectionService.getNotificationService().setOpenConversation(getSelectedConversation()); } } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index a01689ec..e8b3459a 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -351,7 +351,7 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie char current = body.length() > i ? body.charAt(i) : '\n'; if (lineStart == -1) { if (previous == '\n') { - if (current == '>' || current == '\u00bb') { + if ((current == '>' && !UIHelper.isPositionFollowedByNumber(body,i)) || current == '\u00bb') { // Line start with quote lineStart = i; if (quoteStart == -1) quoteStart = i; diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index cc8f68ee..c9f50bed 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -202,7 +202,7 @@ public class UIHelper { for(String l : lines) { if (l.length() > 0) { char first = l.charAt(0); - if (first != '>' && first != '\u00bb') { + if ((first != '>' || isPositionFollowedByNumber(l,0)) && first != '\u00bb') { String line = l.trim(); if (line.isEmpty()) { continue; @@ -226,6 +226,21 @@ public class UIHelper { } } + public static boolean isPositionFollowedByNumber(CharSequence body, int pos) { + boolean previousWasNumber = false; + for (int i = pos +1; i < body.length(); i++) { + char c = body.charAt(i); + if (Character.isDigit(body.charAt(i))) { + previousWasNumber = true; + } else if (previousWasNumber && (c == '.' || c == ',')) { + previousWasNumber = false; + } else { + return Character.isWhitespace(c) && previousWasNumber; + } + } + return previousWasNumber; + } + public static String getFileDescriptionString(final Context context, final Message message) { if (message.getType() == Message.TYPE_IMAGE) { return context.getString(R.string.image); diff --git a/src/main/java/eu/siacs/conversations/xml/TagWriter.java b/src/main/java/eu/siacs/conversations/xml/TagWriter.java index 9d16c338..c0fc1a13 100644 --- a/src/main/java/eu/siacs/conversations/xml/TagWriter.java +++ b/src/main/java/eu/siacs/conversations/xml/TagWriter.java @@ -99,6 +99,13 @@ public class TagWriter { public void forceClose() { finish(); + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //ignoring + } + } outputStream = null; } } diff --git a/src/main/java/eu/siacs/conversations/xml/XmlReader.java b/src/main/java/eu/siacs/conversations/xml/XmlReader.java index 1e6b89d3..58ef07f9 100644 --- a/src/main/java/eu/siacs/conversations/xml/XmlReader.java +++ b/src/main/java/eu/siacs/conversations/xml/XmlReader.java @@ -82,7 +82,7 @@ public class XmlReader { } } catch (Throwable throwable) { - throw new IOException("xml parser mishandled "+throwable.getClass().getName(), throwable); + throw new IOException("xml parser mishandled "+throwable.getClass().getSimpleName()+"("+throwable.getMessage()+")", throwable); } finally { if (wakeLock.isHeld()) { try { diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 08dbdc18..ef5ff854 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -1356,6 +1356,9 @@ public class XmppConnection implements Runnable { } private void forceCloseSocket() { + if (tagWriter != null) { + tagWriter.forceClose(); + } if (socket != null) { try { socket.close(); @@ -1375,7 +1378,6 @@ public class XmppConnection implements Runnable { interrupt(); Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": disconnecting force="+Boolean.valueOf(force)); if (force) { - tagWriter.forceClose(); forceCloseSocket(); } else { if (tagWriter.isActive()) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index 0c0c054d..38098bbe 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -756,7 +756,7 @@ public class JingleConnection implements Transferable { } private void sendFallbackToIbb() { - Log.d(Config.LOGTAG, "sending fallback to ibb"); + Log.d(Config.LOGTAG, account.getJid().toBareJid()+": sending fallback to ibb"); JinglePacket packet = this.bootstrapPacket("transport-replace"); Content content = new Content(this.contentCreator, this.contentName); this.transportId = this.mJingleConnectionManager.nextRandomId(); @@ -767,6 +767,18 @@ public class JingleConnection implements Transferable { this.sendJinglePacket(packet); } + OnTransportConnected onIbbTransportConnected = new OnTransportConnected() { + @Override + public void failed() { + Log.d(Config.LOGTAG, "ibb open failed"); + } + + @Override + public void established() { + JingleConnection.this.transport.send(file, onFileTransmissionSatusChanged); + } + }; + private boolean receiveFallbackToIbb(JinglePacket packet) { Log.d(Config.LOGTAG, "receiving fallack to ibb"); String receivedBlockSize = packet.getJingleContent().ibbTransport() @@ -779,13 +791,28 @@ public class JingleConnection implements Transferable { } this.transportId = packet.getJingleContent().getTransportId(); this.transport = new JingleInbandTransport(this, this.transportId, this.ibbBlockSize); - this.transport.receive(file, onFileTransmissionSatusChanged); + JinglePacket answer = bootstrapPacket("transport-accept"); Content content = new Content("initiator", "a-file-offer"); content.setTransportId(this.transportId); content.ibbTransport().setAttribute("block-size",this.ibbBlockSize); answer.setContent(content); + + + if (initiator.equals(account.getJid())) { + this.sendJinglePacket(answer, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + if (packet.getType() == IqPacket.TYPE.RESULT) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + " recipient ACKed our transport-accept. creating ibb"); + transport.connect(onIbbTransportConnected); + } + } + }); + } else { + this.transport.receive(file, onFileTransmissionSatusChanged); this.sendJinglePacket(answer); + } return true; } @@ -800,19 +827,13 @@ public class JingleConnection implements Transferable { } } this.transport = new JingleInbandTransport(this, this.transportId, this.ibbBlockSize); - this.transport.connect(new OnTransportConnected() { - @Override - public void failed() { - Log.d(Config.LOGTAG, "ibb open failed"); - } - - @Override - public void established() { - JingleConnection.this.transport.send(file, - onFileTransmissionSatusChanged); + //might be receive instead if we are not initiating + if (initiator.equals(account.getJid())) { + this.transport.connect(onIbbTransportConnected); + } else { + this.transport.receive(file,onFileTransmissionSatusChanged); } - }); return true; } else { return false; diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java index 0f0361cd..1d30bdb4 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java @@ -142,6 +142,9 @@ public class JingleConnectionManager extends AbstractConnectionManager { } else if (packet.hasChild("data", "http://jabber.org/protocol/ibb")) { payload = packet.findChild("data", "http://jabber.org/protocol/ibb"); sid = payload.getAttribute("sid"); + } else if (packet.hasChild("close","http://jabber.org/protocol/ibb")) { + payload = packet.findChild("close", "http://jabber.org/protocol/ibb"); + sid = payload.getAttribute("sid"); } if (sid != null) { for (JingleConnection connection : connections) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java index 38a201bd..a87465b2 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java @@ -47,9 +47,11 @@ public class JingleInbandTransport extends JingleTransport { @Override public void onIqPacketReceived(Account account, IqPacket packet) { if (connected && packet.getType() == IqPacket.TYPE.RESULT) { + if (remainingSize > 0) { sendNextBlock(); } } + } }; public JingleInbandTransport(final JingleConnection connection, final String sid, final int blocksize) { @@ -60,6 +62,14 @@ public class JingleInbandTransport extends JingleTransport { this.sessionId = sid; } + private void sendClose() { + IqPacket iq = new IqPacket(IqPacket.TYPE.SET); + iq.setTo(this.counterpart); + Element close = iq.addChild("close", "http://jabber.org/protocol/ibb"); + close.setAttribute("sid", this.sessionId); + this.account.getXmppConnection().sendIqPacket(iq, null); + } + public void connect(final OnTransportConnected callback) { IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.setTo(this.counterpart); @@ -155,6 +165,7 @@ public class JingleInbandTransport extends JingleTransport { try { int count = fileInputStream.read(buffer); if (count == -1) { + sendClose(); file.setSha1Sum(CryptoHelper.bytesToHex(digest.digest())); this.onFileTransmissionStatusChanged.onFileTransmitted(file); fileInputStream.close(); @@ -181,12 +192,13 @@ public class JingleInbandTransport extends JingleTransport { if (this.remainingSize > 0) { connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100)); } else { + sendClose(); file.setSha1Sum(CryptoHelper.bytesToHex(digest.digest())); this.onFileTransmissionStatusChanged.onFileTransmitted(file); fileInputStream.close(); } } catch (IOException e) { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": "+e.getMessage()); + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": io exception during sendNextBlock() "+e.getMessage()); FileBackend.close(fileInputStream); this.onFileTransmissionStatusChanged.onFileTransferAborted(); } @@ -232,7 +244,13 @@ public class JingleInbandTransport extends JingleTransport { this.receiveNextBlock(payload.getContent()); this.account.getXmppConnection().sendIqPacket( packet.generateResponse(IqPacket.TYPE.RESULT), null); + } else if (connected && payload.getName().equals("close")) { + this.connected = false; + this.account.getXmppConnection().sendIqPacket( + packet.generateResponse(IqPacket.TYPE.RESULT), null); + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": received ibb close"); } else { + Log.d(Config.LOGTAG,payload.toString()); // TODO some sort of exception } } |