📄 vcard.java.
字号:
} } return buffer; } /** * Save this vCard for the user connected by 'connection'. Connection should be authenticated * and not anonymous.<p> * <p/> * NOTE: the method is asynchronous and does not wait for the returned value. */ public void save(XMPPConnection connection) { checkAuthenticated(connection); setType(IQ.Type.SET); setFrom(connection.getUser()); connection.sendPacket(this); } /** * Load VCard information for a connected user. Connection should be authenticated * and not anonymous. */ public void load(XMPPConnection connection) throws XMPPException { checkAuthenticated(connection); setFrom(connection.getUser()); doLoad(connection, connection.getUser()); } /** * Load VCard information for a given user. Connection should be authenticated and not anonymous. */ public void load(XMPPConnection connection, String user) throws XMPPException { checkAuthenticated(connection); setTo(user); doLoad(connection, user); } private void doLoad(XMPPConnection connection, String user) throws XMPPException { setType(Type.GET); PacketCollector collector = connection.createPacketCollector( new PacketIDFilter(getPacketID())); connection.sendPacket(this); VCard result = null; try { result = (VCard) collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); if (result == null) { throw new XMPPException(new XMPPError(408, "Timeout getting VCard information")); } if (result.getError() != null) { throw new XMPPException(result.getError()); } } catch (ClassCastException e) { System.out.println("No VCard for " + user); } copyFieldsFrom(result); } public String getChildElementXML() { StringBuffer sb = new StringBuffer(); new VCardWriter(sb).write(); return sb.toString(); } private void copyFieldsFrom(VCard result) { if (result == null) result = new VCard(); Field[] fields = VCard.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (field.getDeclaringClass() == VCard.class && !Modifier.isFinal(field.getModifiers())) { try { field.setAccessible(true); field.set(this, field.get(result)); } catch (IllegalAccessException e) { throw new RuntimeException("This cannot happen:" + field, e); } } } } private void checkAuthenticated(XMPPConnection connection) { if (connection == null) { new IllegalArgumentException("No connection was provided"); } if (!connection.isAuthenticated()) { new IllegalArgumentException("Connection is not authenticated"); } if (connection.isAnonymous()) { new IllegalArgumentException("Connection cannot be anonymous"); } } private boolean hasContent() { //noinspection OverlyComplexBooleanExpression return hasNameField() || hasOrganizationFields() || emailHome != null || emailWork != null || otherSimpleFields.size() > 0 || homeAddr.size() > 0 || homePhones.size() > 0 || workAddr.size() > 0 || workPhones.size() > 0 ; } private boolean hasNameField() { return firstName != null || lastName != null || middleName != null; } private boolean hasOrganizationFields() { return organization != null || organizationUnit != null; } // Used in tests: public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final VCard vCard = (VCard) o; if (emailHome != null ? !emailHome.equals(vCard.emailHome) : vCard.emailHome != null) { return false; } if (emailWork != null ? !emailWork.equals(vCard.emailWork) : vCard.emailWork != null) { return false; } if (firstName != null ? !firstName.equals(vCard.firstName) : vCard.firstName != null) { return false; } if (!homeAddr.equals(vCard.homeAddr)) { return false; } if (!homePhones.equals(vCard.homePhones)) { return false; } if (lastName != null ? !lastName.equals(vCard.lastName) : vCard.lastName != null) { return false; } if (middleName != null ? !middleName.equals(vCard.middleName) : vCard.middleName != null) { return false; } if (organization != null ? !organization.equals(vCard.organization) : vCard.organization != null) { return false; } if (organizationUnit != null ? !organizationUnit.equals(vCard.organizationUnit) : vCard.organizationUnit != null) { return false; } if (!otherSimpleFields.equals(vCard.otherSimpleFields)) { return false; } if (!workAddr.equals(vCard.workAddr)) { return false; } if (!workPhones.equals(vCard.workPhones)) { return false; } return true; } public int hashCode() { int result; result = homePhones.hashCode(); result = 29 * result + workPhones.hashCode(); result = 29 * result + homeAddr.hashCode(); result = 29 * result + workAddr.hashCode(); result = 29 * result + (firstName != null ? firstName.hashCode() : 0); result = 29 * result + (lastName != null ? lastName.hashCode() : 0); result = 29 * result + (middleName != null ? middleName.hashCode() : 0); result = 29 * result + (emailHome != null ? emailHome.hashCode() : 0); result = 29 * result + (emailWork != null ? emailWork.hashCode() : 0); result = 29 * result + (organization != null ? organization.hashCode() : 0); result = 29 * result + (organizationUnit != null ? organizationUnit.hashCode() : 0); result = 29 * result + otherSimpleFields.hashCode(); return result; } public String toString() { return getChildElementXML(); } //============================================================== private class VCardWriter { private final StringBuffer sb; VCardWriter(StringBuffer sb) { this.sb = sb; } public void write() { appendTag("vCard", "xmlns", "vcard-temp", hasContent(), new ContentBuilder() { public void addTagContent() { buildActualContent(); } }); } private void buildActualContent() { if (hasNameField()) { appendFN(); appendN(); } appendOrganization(); appendGenericFields(); appendEmail(emailWork, "WORK"); appendEmail(emailHome, "HOME"); appendPhones(workPhones, "WORK"); appendPhones(homePhones, "HOME"); appendAddress(workAddr, "WORK"); appendAddress(homeAddr, "HOME"); } private void appendEmail(final String email, final String type) { if (email != null) { appendTag("EMAIL", true, new ContentBuilder() { public void addTagContent() { appendEmptyTag(type); appendEmptyTag("INTERNET"); appendEmptyTag("PREF"); appendTag("USERID", email); } }); } } private void appendPhones(Map phones, final String code) { Iterator it = phones.entrySet().iterator(); while (it.hasNext()) { final Map.Entry entry = (Map.Entry) it.next(); appendTag("TEL", true, new ContentBuilder() { public void addTagContent() { appendEmptyTag(entry.getKey()); appendEmptyTag(code); appendTag("NUMBER", (String) entry.getValue()); } }); } } private void appendAddress(final Map addr, final String code) { if (addr.size() > 0) { appendTag("ADR", true, new ContentBuilder() { public void addTagContent() { appendEmptyTag(code); Iterator it = addr.entrySet().iterator(); while (it.hasNext()) { final Map.Entry entry = (Map.Entry) it.next(); appendTag((String) entry.getKey(), (String) entry.getValue()); } } }); } } private void appendEmptyTag(Object tag) { sb.append('<').append(tag).append("/>"); } private void appendGenericFields() { Iterator it = otherSimpleFields.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); appendTag(entry.getKey().toString(), (String) entry.getValue()); } } private void appendOrganization() { if (hasOrganizationFields()) { appendTag("ORG", true, new ContentBuilder() { public void addTagContent() { appendTag("ORGNAME", organization); appendTag("ORGUNIT", organizationUnit); } }); } } private void appendField(String tag) { String value = (String) otherSimpleFields.get(tag); appendTag(tag, value); } private void appendFN() { final ContentBuilder contentBuilder = new ContentBuilder() { public void addTagContent() { if (firstName != null) { sb.append(firstName + ' '); } if (middleName != null) { sb.append(middleName + ' '); } if (lastName != null) { sb.append(lastName); } } }; appendTag("FN", true, contentBuilder); } private void appendN() { appendTag("N", true, new ContentBuilder() { public void addTagContent() { appendTag("FAMILY", lastName); appendTag("GIVEN", firstName); appendTag("MIDDLE", middleName); } }); } private void appendTag(String tag, String attr, String attrValue, boolean hasContent, ContentBuilder builder) { sb.append('<').append(tag); if (attr != null) { sb.append(' ').append(attr).append('=').append('\'').append(attrValue).append('\''); } if (hasContent) { sb.append('>'); builder.addTagContent(); sb.append("</").append(tag).append(">\n"); } else { sb.append("/>\n"); } } private void appendTag(String tag, boolean hasContent, ContentBuilder builder) { appendTag(tag, null, null, hasContent, builder); } private void appendTag(String tag, final String tagText) { if (tagText == null) return; final ContentBuilder contentBuilder = new ContentBuilder() { public void addTagContent() { sb.append(tagText.trim()); } }; appendTag(tag, true, contentBuilder); } } //============================================================== private interface ContentBuilder { void addTagContent(); } //==============================================================}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -