diff options
10 files changed, 173 insertions, 32 deletions
diff --git a/src/eu/siacs/conversations/entities/Conversation.java b/src/eu/siacs/conversations/entities/Conversation.java index 79757f1ec..f8c6a2a68 100644 --- a/src/eu/siacs/conversations/entities/Conversation.java +++ b/src/eu/siacs/conversations/entities/Conversation.java @@ -293,7 +293,7 @@ public class Conversation extends AbstractEntity { return this.otrFingerprint; } - public MucOptions getMucOptions() { + public synchronized MucOptions getMucOptions() { if (this.mucOptions == null) { this.mucOptions = new MucOptions(); } diff --git a/src/eu/siacs/conversations/entities/MucOptions.java b/src/eu/siacs/conversations/entities/MucOptions.java index e429a5ab6..fbca83402 100644 --- a/src/eu/siacs/conversations/entities/MucOptions.java +++ b/src/eu/siacs/conversations/entities/MucOptions.java @@ -107,7 +107,7 @@ public class MucOptions { String type = packet.getAttribute("type"); if (type==null) { User user = new User(); - Element item = packet.findChild("x").findChild("item"); + Element item = packet.findChild("x","http://jabber.org/protocol/muc#user").findChild("item"); user.setName(name); user.setAffiliation(item.getAttribute("affiliation")); user.setRole(item.getAttribute("role")); @@ -121,7 +121,7 @@ public class MucOptions { } } else if (type.equals("unavailable")) { if (name.equals(getNick())) { - Element item = packet.findChild("x").findChild("item"); + Element item = packet.findChild("x","http://jabber.org/protocol/muc#user").findChild("item"); String nick = item.getAttribute("nick"); if (nick!=null) { aboutToRename = false; diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index 8d428e37c..90aac54ec 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -39,6 +39,7 @@ import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnBindListener; import eu.siacs.conversations.xmpp.OnIqPacketReceived; +import eu.siacs.conversations.xmpp.OnJinglePacketReceived; import eu.siacs.conversations.xmpp.OnMessagePacketReceived; import eu.siacs.conversations.xmpp.OnPresencePacketReceived; import eu.siacs.conversations.xmpp.OnStatusChanged; @@ -47,6 +48,7 @@ import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.stanzas.IqPacket; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; +import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; @@ -230,12 +232,18 @@ public class XmppConnectionService extends Service { @Override public void onPresencePacketReceived(Account account, PresencePacket packet) { - if (packet.hasChild("x") - && (packet.findChild("x").getAttribute("xmlns") - .startsWith("http://jabber.org/protocol/muc"))) { + if (packet.hasChild("x","http://jabber.org/protocol/muc#user")) { Conversation muc = findMuc( packet.getAttribute("from").split("/")[0], account); if (muc != null) { + muc.getMucOptions().processPacket(packet); + } else { + Log.d(LOGTAG,account.getJid()+": could not find muc for received muc package "+packet.toString()); + } + } else if (packet.hasChild("x","http://jabber.org/protocol/muc")) { + Conversation muc = findMuc(packet.getAttribute("from").split("/")[0], account); + if (muc != null) { + Log.d(LOGTAG,account.getJid()+": reading muc status packet "+packet.toString()); int error = muc.getMucOptions().getError(); muc.getMucOptions().processPacket(packet); if ((muc.getMucOptions().getError() != error) @@ -267,10 +275,8 @@ public class XmppConnectionService extends Service { contact.updatePresence(fromParts[1], Presences.parseShow(packet.findChild("show"))); PgpEngine pgp = getPgpEngine(); if (pgp != null) { - Element x = packet.findChild("x"); - if ((x != null) - && (x.getAttribute("xmlns") - .equals("jabber:x:signed"))) { + Element x = packet.findChild("x","jabber:x:signed"); + if (x != null) { try { contact.setPgpKeyId(pgp.fetchKeyId( packet.findChild("status") @@ -311,7 +317,7 @@ public class XmppConnectionService extends Service { // TODO: ask user to handle it maybe } } else { - // Log.d(LOGTAG, packet.toString()); + //Log.d(LOGTAG, packet.toString()); } replaceContactInConversation(contact.getJid(), contact); } @@ -333,6 +339,14 @@ public class XmppConnectionService extends Service { } } }; + + private OnJinglePacketReceived jingleListener = new OnJinglePacketReceived() { + + @Override + public void onJinglePacketReceived(Account account, JinglePacket packet) { + Log.d(LOGTAG,account.getJid()+": jingle packet received"+packet.toString()); + } + }; private OpenPgpServiceConnection pgpServiceConnection; private PgpEngine mPgpEngine = null; @@ -498,6 +512,8 @@ public class XmppConnectionService extends Service { databaseBackend = DatabaseBackend.getInstance(getApplicationContext()); this.accounts = databaseBackend.getAccounts(); + this.getConversations(); + getContentResolver().registerContentObserver( ContactsContract.Contacts.CONTENT_URI, true, contactObserver); this.pgpServiceConnection = new OpenPgpServiceConnection( @@ -569,6 +585,7 @@ public class XmppConnectionService extends Service { connection.setOnPresencePacketReceivedListener(this.presenceListener); connection .setOnUnregisteredIqPacketReceivedListener(this.unknownIqListener); + connection.setOnJinglePacketReceivedListener(this.jingleListener); connection .setOnTLSExceptionReceivedListener(new OnTLSExceptionReceived() { @@ -897,9 +914,6 @@ public class XmppConnectionService extends Service { conversation.setAccount(account); if (muc) { conversation.setMode(Conversation.MODE_MULTI); - if (account.getStatus() == Account.STATUS_ONLINE) { - joinMuc(conversation); - } } else { conversation.setMode(Conversation.MODE_SINGLE); } @@ -919,9 +933,6 @@ public class XmppConnectionService extends Service { if (muc) { conversation = new Conversation(conversationName, account, jid, Conversation.MODE_MULTI); - if (account.getStatus() == Account.STATUS_ONLINE) { - joinMuc(conversation); - } } else { conversation = new Conversation(conversationName, account, jid, Conversation.MODE_SINGLE); @@ -930,6 +941,9 @@ public class XmppConnectionService extends Service { this.databaseBackend.createConversation(conversation); } this.conversations.add(conversation); + if ((account.getStatus() == Account.STATUS_ONLINE)&&(conversation.getMode() == Conversation.MODE_MULTI)) { + joinMuc(conversation); + } if (this.convChangedListener != null) { this.convChangedListener.onConversationListChanged(); } @@ -1037,6 +1051,7 @@ public class XmppConnectionService extends Service { x.addChild("history").setAttribute("seconds", diff + ""); } packet.addChild(x); + Log.d(LOGTAG,conversation.getAccount().getJid()+": joining muc "+packet.toString()); conversation.getAccount().getXmppConnection() .sendPresencePacket(packet); } diff --git a/src/eu/siacs/conversations/ui/MucDetailsActivity.java b/src/eu/siacs/conversations/ui/MucDetailsActivity.java index 8d90fd566..bf36f156e 100644 --- a/src/eu/siacs/conversations/ui/MucDetailsActivity.java +++ b/src/eu/siacs/conversations/ui/MucDetailsActivity.java @@ -82,9 +82,6 @@ public class MucDetailsActivity extends XmppActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getIntent().getAction().equals(ACTION_VIEW_MUC)) { - this.uuid = getIntent().getExtras().getString("uuid"); - } setContentView(R.layout.activity_muc_details); mYourNick = (EditText) findViewById(R.id.muc_your_nick); mFullJid = (TextView) findViewById(R.id.muc_jabberid); @@ -135,6 +132,9 @@ public class MucDetailsActivity extends XmppActivity { void onBackendConnected() { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); boolean useSubject = preferences.getBoolean("use_subject_in_muc", true); + if (getIntent().getAction().equals(ACTION_VIEW_MUC)) { + this.uuid = getIntent().getExtras().getString("uuid"); + } if (uuid != null) { for (Conversation mConv : xmppConnectionService.getConversations()) { if (mConv.getUuid().equals(uuid)) { @@ -183,6 +183,8 @@ public class MucDetailsActivity extends XmppActivity { membersView.addView(view); } } + } else { + Log.d("xmppService","uuid in muc details was null"); } } } diff --git a/src/eu/siacs/conversations/xml/Element.java b/src/eu/siacs/conversations/xml/Element.java index 91d9ed6b4..2f1d7ad8c 100644 --- a/src/eu/siacs/conversations/xml/Element.java +++ b/src/eu/siacs/conversations/xml/Element.java @@ -50,19 +50,34 @@ public class Element { return null; } - public boolean hasChild(String name) { + public Element findChild(String name, String xmlns) { for(Element child : this.children) { - if (child.getName().equals(name)) { - return true; + if (child.getName().equals(name)&&(child.getAttribute("xmlns").equals(xmlns))) { + return child; } } - return false; + return null; + } + + public boolean hasChild(String name) { + return findChild(name) != null; + } + + public boolean hasChild(String name, String xmlns) { + return findChild(name, xmlns) != null; } + + public List<Element> getChildren() { return this.children; } + public Element setChildren(List<Element> children) { + this.children = children; + return this; + } + public String getContent() { return content; } @@ -85,6 +100,10 @@ public class Element { } } + public Hashtable<String, String> getAttributes() { + return this.attributes; + } + public String toString() { StringBuilder elementOutput = new StringBuilder(); if ((content==null)&&(children.size() == 0)) { diff --git a/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java b/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java new file mode 100644 index 000000000..6705e3098 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java @@ -0,0 +1,8 @@ +package eu.siacs.conversations.xmpp; + +import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; + +public interface OnJinglePacketReceived extends PacketReceived { + public void onJinglePacketReceived(Account account, JinglePacket packet); +} diff --git a/src/eu/siacs/conversations/xmpp/XmppConnection.java b/src/eu/siacs/conversations/xmpp/XmppConnection.java index ec5ab1f6c..e265b9976 100644 --- a/src/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/eu/siacs/conversations/xmpp/XmppConnection.java @@ -46,6 +46,7 @@ import eu.siacs.conversations.xmpp.stanzas.AbstractStanza; import eu.siacs.conversations.xmpp.stanzas.IqPacket; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; +import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.AckPacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.EnablePacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.RequestPacket; @@ -86,6 +87,7 @@ public class XmppConnection implements Runnable { private Hashtable<String, PacketReceived> packetCallbacks = new Hashtable<String, PacketReceived>(); private OnPresencePacketReceived presenceListener = null; + private OnJinglePacketReceived jingleListener = null; private OnIqPacketReceived unregisteredIqListener = null; private OnMessagePacketReceived messageListener = null; private OnStatusChanged statusListener = null; @@ -284,6 +286,10 @@ public class XmppConnection implements Runnable { while (!nextTag.isEnd(element.getName())) { if (!nextTag.isNo()) { Element child = tagReader.readElement(nextTag); + if ((packetType == PACKET_IQ)&&("jingle".equals(child.getName()))) { + element = new JinglePacket(); + element.setAttributes(currentTag.getAttributes()); + } element.addChild(child); } nextTag = tagReader.readTag(); @@ -296,15 +302,22 @@ public class XmppConnection implements Runnable { private void processIq(Tag currentTag) throws XmlPullParserException, IOException { IqPacket packet = (IqPacket) processPacket(currentTag, PACKET_IQ); - if (packetCallbacks.containsKey(packet.getId())) { - if (packetCallbacks.get(packet.getId()) instanceof OnIqPacketReceived) { - ((OnIqPacketReceived) packetCallbacks.get(packet.getId())) - .onIqPacketReceived(account, packet); + + if (packet instanceof JinglePacket) { + if (this.jingleListener !=null) { + this.jingleListener.onJinglePacketReceived(account, (JinglePacket) packet); + } + } else { + if (packetCallbacks.containsKey(packet.getId())) { + if (packetCallbacks.get(packet.getId()) instanceof OnIqPacketReceived) { + ((OnIqPacketReceived) packetCallbacks.get(packet.getId())) + .onIqPacketReceived(account, packet); + } + + packetCallbacks.remove(packet.getId()); + } else if (this.unregisteredIqListener != null) { + this.unregisteredIqListener.onIqPacketReceived(account, packet); } - - packetCallbacks.remove(packet.getId()); - } else if (this.unregisteredIqListener != null) { - this.unregisteredIqListener.onIqPacketReceived(account, packet); } } @@ -684,6 +697,10 @@ public class XmppConnection implements Runnable { OnPresencePacketReceived listener) { this.presenceListener = listener; } + + public void setOnJinglePacketReceivedListener(OnJinglePacketReceived listener) { + this.jingleListener = listener; + } public void setOnStatusChangedListener(OnStatusChanged listener) { this.statusListener = listener; diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java new file mode 100644 index 000000000..ebd212b86 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java @@ -0,0 +1,13 @@ +package eu.siacs.conversations.xmpp.stanzas.jingle; + +import eu.siacs.conversations.xml.Element; + +public class Content extends Element { + private Content(String name) { + super(name); + } + + public Content() { + super("content"); + } +} diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java new file mode 100644 index 000000000..51c60d1fb --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java @@ -0,0 +1,54 @@ +package eu.siacs.conversations.xmpp.stanzas.jingle; + +import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; + +public class JinglePacket extends IqPacket { + Content content = null; + Reason reason = null; + + @Override + public Element addChild(Element child) { + if ("jingle".equals(child.getName())) { + Element contentElement = child.findChild("content"); + if (contentElement!=null) { + this.content = new Content(); + this.content.setChildren(contentElement.getChildren()); + this.content.setAttributes(contentElement.getAttributes()); + } + Element reasonElement = child.findChild("reason"); + if (reasonElement!=null) { + this.reason = new Reason(); + this.reason.setChildren(reasonElement.getChildren()); + this.reason.setAttributes(reasonElement.getAttributes()); + } + this.build(); + this.findChild("jingle").setAttributes(child.getAttributes()); + } + return child; + } + + public JinglePacket setContent(Content content) { + this.content = content; + this.build(); + return this; + } + + public JinglePacket setReason(Reason reason) { + this.reason = reason; + this.build(); + return this; + } + + private void build() { + this.children.clear(); + Element jingle = addChild("jingle", "urn:xmpp:jingle:1"); + if (this.content!=null) { + jingle.addChild(this.content); + } + if (this.reason != null) { + jingle.addChild(this.reason); + } + this.children.add(jingle); + } +} diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java new file mode 100644 index 000000000..35b81655e --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java @@ -0,0 +1,13 @@ +package eu.siacs.conversations.xmpp.stanzas.jingle; + +import eu.siacs.conversations.xml.Element; + +public class Reason extends Element { + private Reason(String name) { + super(name); + } + + public Reason() { + super("reason"); + } +} |