From 43531113b798cda6b2f76257641f38b0af986437 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 1 Feb 2014 01:25:56 +0100 Subject: [PATCH] more code cleanup for xmpp parser. more eventy. nice unknown contact pictures --- gen/de/gultsch/chat/R.java | 3 +- ic_launcher-web.png | Bin 16179 -> 0 bytes ic_profile-web.png | Bin 11878 -> 0 bytes res/drawable-hdpi/es_slidingpane_shadow.xml | 8 - res/drawable-mdpi/es_slidingpane_shadow.xml | 8 - res/drawable-xxhdpi/es_slidingpane_shadow.xml | 8 - .../es_slidingpane_shadow.xml | 2 +- .../section_header.xml | 0 .../fragment_conversations_overview.xml | 6 +- src/de/gultsch/chat/entities/Contact.java | 5 +- .../gultsch/chat/entities/Conversation.java | 5 +- .../gultsch/chat/ui/ConversationActivity.java | 11 ++ .../chat/ui/NewConversationActivity.java | 20 ++- src/de/gultsch/chat/utils/Beautifier.java | 43 +++++- src/de/gultsch/chat/xml/Element.java | 19 +++ src/de/gultsch/chat/xmpp/IqPacket.java | 7 +- .../gultsch/chat/xmpp/OnIqPacketReceived.java | 5 + .../chat/xmpp/OnMessagePacketReceived.java | 5 + .../chat/xmpp/OnPresencePacketReceived.java | 5 + src/de/gultsch/chat/xmpp/XmppConnection.java | 138 ++++++++++-------- 20 files changed, 185 insertions(+), 113 deletions(-) delete mode 100644 ic_launcher-web.png delete mode 100644 ic_profile-web.png delete mode 100644 res/drawable-hdpi/es_slidingpane_shadow.xml delete mode 100644 res/drawable-mdpi/es_slidingpane_shadow.xml delete mode 100644 res/drawable-xxhdpi/es_slidingpane_shadow.xml rename res/{drawable-xhdpi => drawable}/es_slidingpane_shadow.xml (82%) rename res/{drawable-xhdpi => drawable}/section_header.xml (100%) create mode 100644 src/de/gultsch/chat/xmpp/OnIqPacketReceived.java create mode 100644 src/de/gultsch/chat/xmpp/OnMessagePacketReceived.java create mode 100644 src/de/gultsch/chat/xmpp/OnPresencePacketReceived.java diff --git a/gen/de/gultsch/chat/R.java b/gen/de/gultsch/chat/R.java index b7dde8f47..45083c731 100644 --- a/gen/de/gultsch/chat/R.java +++ b/gen/de/gultsch/chat/R.java @@ -34,8 +34,7 @@ public final class R { public static final int ic_launcher=0x7f020006; public static final int ic_profile=0x7f020007; public static final int message_border=0x7f020008; - public static final int profilemock=0x7f020009; - public static final int section_header=0x7f02000a; + public static final int section_header=0x7f020009; } public static final class id { public static final int account_confirm_password_desc=0x7f0a0011; diff --git a/ic_launcher-web.png b/ic_launcher-web.png deleted file mode 100644 index 8e26a93105349c0f78c3142c60854c146bc53112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16179 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 diff --git a/ic_profile-web.png b/ic_profile-web.png deleted file mode 100644 index c0c6ca8f6c1b05aa970fe8ddfe14b87a61bd0dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11878 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 diff --git a/res/drawable-hdpi/es_slidingpane_shadow.xml b/res/drawable-hdpi/es_slidingpane_shadow.xml deleted file mode 100644 index eaca7894e..000000000 --- a/res/drawable-hdpi/es_slidingpane_shadow.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/drawable-mdpi/es_slidingpane_shadow.xml b/res/drawable-mdpi/es_slidingpane_shadow.xml deleted file mode 100644 index eaca7894e..000000000 --- a/res/drawable-mdpi/es_slidingpane_shadow.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/drawable-xxhdpi/es_slidingpane_shadow.xml b/res/drawable-xxhdpi/es_slidingpane_shadow.xml deleted file mode 100644 index eaca7894e..000000000 --- a/res/drawable-xxhdpi/es_slidingpane_shadow.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/drawable-xhdpi/es_slidingpane_shadow.xml b/res/drawable/es_slidingpane_shadow.xml similarity index 82% rename from res/drawable-xhdpi/es_slidingpane_shadow.xml rename to res/drawable/es_slidingpane_shadow.xml index cc711819e..34cc44bf4 100644 --- a/res/drawable-xhdpi/es_slidingpane_shadow.xml +++ b/res/drawable/es_slidingpane_shadow.xml @@ -2,6 +2,6 @@ + android:startColor="#eeeeee" /> \ No newline at end of file diff --git a/res/drawable-xhdpi/section_header.xml b/res/drawable/section_header.xml similarity index 100% rename from res/drawable-xhdpi/section_header.xml rename to res/drawable/section_header.xml diff --git a/res/layout/fragment_conversations_overview.xml b/res/layout/fragment_conversations_overview.xml index ae60de40a..5548cce62 100644 --- a/res/layout/fragment_conversations_overview.xml +++ b/res/layout/fragment_conversations_overview.xml @@ -6,7 +6,9 @@ + android:orientation="vertical" + android:background="#eeeeee" + > diff --git a/src/de/gultsch/chat/entities/Contact.java b/src/de/gultsch/chat/entities/Contact.java index 30dfc05bc..66221f8a3 100644 --- a/src/de/gultsch/chat/entities/Contact.java +++ b/src/de/gultsch/chat/entities/Contact.java @@ -20,9 +20,8 @@ public class Contact implements Serializable { return this.display_name; } - public Uri getProfilePhoto() { - if (photo == null) return null; - return Uri.parse(photo); + public String getProfilePhoto() { + return photo; } public String getJid() { diff --git a/src/de/gultsch/chat/entities/Conversation.java b/src/de/gultsch/chat/entities/Conversation.java index a00dd476a..10eb70797 100644 --- a/src/de/gultsch/chat/entities/Conversation.java +++ b/src/de/gultsch/chat/entities/Conversation.java @@ -33,10 +33,9 @@ public class Conversation extends AbstractEntity { private transient List messages = null; - public Conversation(String name, Uri profilePhoto, Account account, + public Conversation(String name, String profilePhoto, Account account, String contactJid) { - this(java.util.UUID.randomUUID().toString(), name, profilePhoto - .toString(), account.getUuid(), contactJid, System + this(java.util.UUID.randomUUID().toString(), name, profilePhoto, account.getUuid(), contactJid, System .currentTimeMillis(), STATUS_AVAILABLE); } diff --git a/src/de/gultsch/chat/ui/ConversationActivity.java b/src/de/gultsch/chat/ui/ConversationActivity.java index d831f9b8b..79d1e218f 100644 --- a/src/de/gultsch/chat/ui/ConversationActivity.java +++ b/src/de/gultsch/chat/ui/ConversationActivity.java @@ -9,6 +9,7 @@ import de.gultsch.chat.R; import de.gultsch.chat.R.id; import de.gultsch.chat.entities.Conversation; import de.gultsch.chat.utils.Beautifier; +import android.net.Uri; import android.os.Bundle; import android.app.FragmentTransaction; import android.content.Context; @@ -106,6 +107,16 @@ public class ConversationActivity extends XmppActivity { ((TextView) view.findViewById(R.id.conversation_lastmsg)).setText(getItem(position).getLatestMessage()); ((TextView) view.findViewById(R.id.conversation_lastupdate)) .setText(Beautifier.readableTimeDifference(getItem(position).getLatestMessageDate())); + + Uri profilePhoto = getItem(position).getProfilePhotoUri(); + ImageView imageView = (ImageView) view.findViewById(R.id.conversation_image); + if (profilePhoto!=null) { + imageView.setImageURI(profilePhoto); + } else { + imageView.setImageBitmap(Beautifier.getUnknownContactPicture(getItem(position).getName(),200)); + } + + ((ImageView) view.findViewById(R.id.conversation_image)) .setImageURI(getItem(position).getProfilePhotoUri()); return view; diff --git a/src/de/gultsch/chat/ui/NewConversationActivity.java b/src/de/gultsch/chat/ui/NewConversationActivity.java index 9df5d5eb8..b8061b23e 100644 --- a/src/de/gultsch/chat/ui/NewConversationActivity.java +++ b/src/de/gultsch/chat/ui/NewConversationActivity.java @@ -9,7 +9,9 @@ import de.gultsch.chat.R; import de.gultsch.chat.entities.Account; import de.gultsch.chat.entities.Contact; import de.gultsch.chat.entities.Conversation; +import de.gultsch.chat.utils.Beautifier; import de.gultsch.chat.utils.Validator; +import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.text.Editable; @@ -74,8 +76,7 @@ public class NewConversationActivity extends XmppActivity { if (Validator.isValidJid(searchString)) { String name = searchString.split("@")[0]; - Contact newContact = new Contact(name, searchString, - DEFAULT_PROFILE_PHOTO); + Contact newContact = new Contact(name, searchString,null); aggregatedContacts.add(newContact); contactsHeader.setText("Create new contact"); } else { @@ -100,8 +101,6 @@ public class NewConversationActivity extends XmppActivity { + "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL + "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER + "\")"; - protected static final String DEFAULT_PROFILE_PHOTO = "android.resource://de.gultsch.chat/" - + R.drawable.ic_profile; @Override protected void onCreate(Bundle savedInstanceState) { @@ -150,8 +149,13 @@ public class NewConversationActivity extends XmppActivity { .setText(getItem(position).getDisplayName()); ((TextView) view.findViewById(R.id.contact_jid)) .setText(getItem(position).getJid()); - ((ImageView) view.findViewById(R.id.contact_photo)) - .setImageURI(getItem(position).getProfilePhoto()); + String profilePhoto = getItem(position).getProfilePhoto(); + ImageView imageView = (ImageView) view.findViewById(R.id.contact_photo); + if (profilePhoto!=null) { + imageView.setImageURI(Uri.parse(profilePhoto)); + } else { + imageView.setImageBitmap(Beautifier.getUnknownContactPicture(getItem(position).getDisplayName(),90)); + } return view; } }; @@ -222,9 +226,9 @@ public class NewConversationActivity extends XmppActivity { while (cursor.moveToNext()) { String profilePhoto = cursor.getString(cursor .getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI)); - if (profilePhoto == null) { + /*if (profilePhoto == null) { profilePhoto = DEFAULT_PROFILE_PHOTO; - } + }*/ Contact contact = new Contact( cursor.getString(cursor .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)), diff --git a/src/de/gultsch/chat/utils/Beautifier.java b/src/de/gultsch/chat/utils/Beautifier.java index 43b7acc2c..5184c0c79 100644 --- a/src/de/gultsch/chat/utils/Beautifier.java +++ b/src/de/gultsch/chat/utils/Beautifier.java @@ -3,18 +3,24 @@ package de.gultsch.chat.utils; import java.text.SimpleDateFormat; import java.util.Date; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.DisplayMetrics; + public class Beautifier { public static String readableTimeDifference(long time) { - if (time==0) { + if (time == 0) { return "just now"; } Date date = new Date(time); long difference = (System.currentTimeMillis() - time) / 1000; - if (difference<60) { + if (difference < 60) { return "just now"; - } else if (difference<60*10) { + } else if (difference < 60 * 10) { return difference / 60 + " min ago"; - } else if (difference<60*60*24) { + } else if (difference < 60 * 60 * 24) { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); return sdf.format(date); } else { @@ -22,4 +28,33 @@ public class Beautifier { return sdf.format(date); } } + + public static Bitmap getUnknownContactPicture(String name, int size) { + String firstLetter = name.substring(0, 1).toUpperCase(); + String centerLetter = name.substring(name.length() / 2, + (name.length() / 2) + 1); + + int holoColors[] = { 0xFF1da9da, 0xFFb368d9, 0xFF83b600, 0xFFffa713, + 0xFFe92727 }; + + int color = holoColors[centerLetter.charAt(0) % holoColors.length]; + + Bitmap bitmap = Bitmap + .createBitmap(size, size, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + bitmap.eraseColor(color); + + Paint paint = new Paint(); + paint.setColor(0xffe5e5e5); + paint.setTextSize((float) (size * 0.9)); + paint.setAntiAlias(true); + Rect rect = new Rect(); + paint.getTextBounds(firstLetter, 0, 1, rect); + float width = paint.measureText(firstLetter); + canvas.drawText(firstLetter, (size / 2) - (width / 2), (size / 2) + + (rect.height() / 2), paint); + + return bitmap; + } } diff --git a/src/de/gultsch/chat/xml/Element.java b/src/de/gultsch/chat/xml/Element.java index d6d1b23d7..af3d8f1ff 100644 --- a/src/de/gultsch/chat/xml/Element.java +++ b/src/de/gultsch/chat/xml/Element.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.List; +import android.util.Log; + public class Element { protected String name; protected Hashtable attributes = new Hashtable(); @@ -26,6 +28,15 @@ public class Element { return this; } + public boolean hasChild(String name) { + for(Element child : this.children) { + if (child.getName().equals(name)) { + return true; + } + } + return false; + } + public Element setAttribute(String name, String value) { this.attributes.put(name, value); return this; @@ -36,6 +47,14 @@ public class Element { return this; } + public String getAttribute(String name) { + if (this.attributes.containsKey(name)) { + return this.attributes.get(name); + } else { + return null; + } + } + public String toString() { StringBuilder elementOutput = new StringBuilder(); if ((content==null)&&(children.size() == 0)) { diff --git a/src/de/gultsch/chat/xmpp/IqPacket.java b/src/de/gultsch/chat/xmpp/IqPacket.java index eec66a64f..d7672540d 100644 --- a/src/de/gultsch/chat/xmpp/IqPacket.java +++ b/src/de/gultsch/chat/xmpp/IqPacket.java @@ -12,9 +12,8 @@ public class IqPacket extends Element { super(name); } - public IqPacket(String id, int type) { + public IqPacket(int type) { super("iq"); - this.setAttribute("id",id); switch (type) { case TYPE_SET: this.setAttribute("type", "set"); @@ -34,4 +33,8 @@ public class IqPacket extends Element { super("iq"); } + public String getId() { + return this.getAttribute("id"); + } + } diff --git a/src/de/gultsch/chat/xmpp/OnIqPacketReceived.java b/src/de/gultsch/chat/xmpp/OnIqPacketReceived.java new file mode 100644 index 000000000..5e69b0cea --- /dev/null +++ b/src/de/gultsch/chat/xmpp/OnIqPacketReceived.java @@ -0,0 +1,5 @@ +package de.gultsch.chat.xmpp; + +public interface OnIqPacketReceived { + public void onIqPacketReceived(IqPacket packet); +} diff --git a/src/de/gultsch/chat/xmpp/OnMessagePacketReceived.java b/src/de/gultsch/chat/xmpp/OnMessagePacketReceived.java new file mode 100644 index 000000000..9f4e6317b --- /dev/null +++ b/src/de/gultsch/chat/xmpp/OnMessagePacketReceived.java @@ -0,0 +1,5 @@ +package de.gultsch.chat.xmpp; + +public interface OnMessagePacketReceived { + public void onMessagePacketReceived(MessagePacket packet); +} diff --git a/src/de/gultsch/chat/xmpp/OnPresencePacketReceived.java b/src/de/gultsch/chat/xmpp/OnPresencePacketReceived.java new file mode 100644 index 000000000..d48c430da --- /dev/null +++ b/src/de/gultsch/chat/xmpp/OnPresencePacketReceived.java @@ -0,0 +1,5 @@ +package de.gultsch.chat.xmpp; + +public interface OnPresencePacketReceived { + public void onPresencePacketReceived(PresencePacket packet); +} diff --git a/src/de/gultsch/chat/xmpp/XmppConnection.java b/src/de/gultsch/chat/xmpp/XmppConnection.java index de35a0ea0..a167bd87f 100644 --- a/src/de/gultsch/chat/xmpp/XmppConnection.java +++ b/src/de/gultsch/chat/xmpp/XmppConnection.java @@ -7,6 +7,7 @@ import java.math.BigInteger; import java.net.Socket; import java.net.UnknownHostException; import java.security.SecureRandom; +import java.util.Hashtable; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; @@ -35,12 +36,19 @@ public class XmppConnection implements Runnable { private XmlReader tagReader; private TagWriter tagWriter; - private boolean isTlsEncrypted = true; + private boolean isTlsEncrypted = false; private boolean isAuthenticated = false; + private boolean shouldUseTLS = false; + private boolean shouldReConnect = true; + private boolean shouldBind = true; + private boolean shouldAuthenticate = true; + private Element streamFeatures; private static final int PACKET_IQ = 0; private static final int PACKET_MESSAGE = 1; private static final int PACKET_PRESENCE = 2; + + private Hashtable iqPacketCallbacks = new Hashtable(); public XmppConnection(Account account, PowerManager pm) { this.account = account; @@ -58,17 +66,6 @@ public class XmppConnection implements Runnable { tagWriter.setOutputStream(out); InputStream in = socket.getInputStream(); tagReader.setInputStream(in); - } catch (UnknownHostException e) { - Log.d(LOGTAG, "error during connect. unknown host"); - } catch (IOException e) { - Log.d(LOGTAG, "error during connect. io exception. falscher port?"); - } - } - - @Override - public void run() { - connect(); - try { tagWriter.beginDocument(); sendStartStream(); Tag nextTag; @@ -77,14 +74,25 @@ public class XmppConnection implements Runnable { processStream(nextTag); } else { Log.d(LOGTAG, "found unexpected tag: " + nextTag.getName()); + return; } } - } catch (XmlPullParserException e) { - Log.d(LOGTAG, - "xml error during normal read. maybe missformed xml? " - + e.getMessage()); + } catch (UnknownHostException e) { + Log.d(LOGTAG, "error during connect. unknown host"); + return; } catch (IOException e) { - Log.d(LOGTAG, "io exception during read. connection lost?"); + Log.d(LOGTAG, "error during connect. io exception. falscher port?"); + return; + } catch (XmlPullParserException e) { + Log.d(LOGTAG,"xml exception "+e.getMessage()); + return; + } + } + + @Override + public void run() { + while(shouldReConnect) { + connect(); } } @@ -92,20 +100,11 @@ public class XmppConnection implements Runnable { IOException { Log.d(LOGTAG, "process Stream"); Tag nextTag; - while ((nextTag = tagReader.readTag()) != null) { + while (!(nextTag = tagReader.readTag()).isEnd("stream")) { if (nextTag.isStart("error")) { processStreamError(nextTag); } else if (nextTag.isStart("features")) { processStreamFeatures(nextTag); - if (!isTlsEncrypted) { - sendStartTLS(); - } - if ((!isAuthenticated) && (isTlsEncrypted)) { - sendSaslAuth(); - } - if ((isAuthenticated)&&(isTlsEncrypted)) { - sendBindRequest(); - } } else if (nextTag.isStart("proceed")) { switchOverToTls(nextTag); } else if (nextTag.isStart("success")) { @@ -121,8 +120,6 @@ public class XmppConnection implements Runnable { Log.d(LOGTAG,processMessage(nextTag).toString()); } else if (nextTag.isStart("presence")) { Log.d(LOGTAG,processPresence(nextTag).toString()); - } else if (nextTag.isEnd("stream")) { - break; } else { Log.d(LOGTAG, "found unexpected tag: " + nextTag.getName() + " as child of " + currentTag.getName()); @@ -159,7 +156,12 @@ public class XmppConnection implements Runnable { private IqPacket processIq(Tag currentTag) throws XmlPullParserException, IOException { - return (IqPacket) processPacket(currentTag,PACKET_IQ); + IqPacket packet = (IqPacket) processPacket(currentTag,PACKET_IQ); + if (iqPacketCallbacks.containsKey(packet.getId())) { + iqPacketCallbacks.get(packet.getId()).onIqPacketReceived(packet); + iqPacketCallbacks.remove(packet.getId()); + } + return packet; } private MessagePacket processMessage(Tag currentTag) throws XmlPullParserException, IOException { @@ -212,47 +214,44 @@ public class XmppConnection implements Runnable { private void processStreamFeatures(Tag currentTag) throws XmlPullParserException, IOException { - Log.d(LOGTAG, "processStreamFeatures"); - - Element streamFeatures = new Element("features"); - - Tag nextTag = tagReader.readTag(); - while(!nextTag.isEnd("features")) { - Element element = tagReader.readElement(nextTag); - streamFeatures.addChild(element); - nextTag = tagReader.readTag(); + this.streamFeatures = tagReader.readElement(currentTag); + Log.d(LOGTAG,"process stream features "+streamFeatures); + if (this.streamFeatures.hasChild("starttls")&&shouldUseTLS) { + sendStartTLS(); + } + if (this.streamFeatures.hasChild("mechanisms")&&shouldAuthenticate) { + sendSaslAuth(); + } + if (this.streamFeatures.hasChild("bind")&&shouldBind) { + sendBindRequest(); + if (this.streamFeatures.hasChild("session")) { + IqPacket startSession = new IqPacket(IqPacket.TYPE_SET); + Element session = new Element("session"); + session.setAttribute("xmlns","urn:ietf:params:xml:ns:xmpp-session"); + session.setContent(""); + startSession.addChild(session); + sendIqPacket(startSession, null); + tagWriter.writeElement(startSession); + tagWriter.flush(); + } + Element presence = new Element("presence"); + + tagWriter.writeElement(presence); + tagWriter.flush(); } - Log.d(LOGTAG,streamFeatures.toString()); } private void sendBindRequest() throws IOException { - IqPacket iq = new IqPacket(nextRandomId(),IqPacket.TYPE_SET); + IqPacket iq = new IqPacket(IqPacket.TYPE_SET); Element bind = new Element("bind"); bind.setAttribute("xmlns","urn:ietf:params:xml:ns:xmpp-bind"); iq.addChild(bind); - //Element resource = new Element("resource"); - //resource.setContent("mobile"); - //bind.addChild(resource); - Log.d(LOGTAG,"sending bind request: "+iq.toString()); - tagWriter.writeElement(iq); - tagWriter.flush(); - - - //technically not bind stuff - IqPacket startSession = new IqPacket(this.nextRandomId(), IqPacket.TYPE_SET); - Element session = new Element("session"); - session.setAttribute("xmlns","urn:ietf:params:xml:ns:xmpp-session"); - session.setContent(""); - startSession.addChild(session); - - tagWriter.writeElement(startSession); - tagWriter.flush(); - - Element presence = new Element("presence"); - - tagWriter.writeElement(presence); - tagWriter.flush(); - + this.sendIqPacket(iq, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(IqPacket packet) { + Log.d(LOGTAG,"answer for our bind was: "+packet.toString()); + } + }); } private void processStreamError(Tag currentTag) { @@ -273,4 +272,15 @@ public class XmppConnection implements Runnable { private String nextRandomId() { return new BigInteger(50, random).toString(32); } + + public void sendIqPacket(IqPacket packet, OnIqPacketReceived callback) throws IOException { + String id = nextRandomId(); + packet.setAttribute("id",id); + tagWriter.writeElement(packet); + tagWriter.flush(); + if (callback != null) { + iqPacketCallbacks.put(id, callback); + } + Log.d(LOGTAG,"sending: "+packet.toString()); + } }