VCardProvider.java
- /**
- *
- * Copyright 2003-2007 Jive Software.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.jivesoftware.smackx.vcardtemp.provider;
- import org.jivesoftware.smack.SmackException;
- import org.jivesoftware.smack.provider.IQProvider;
- import org.jivesoftware.smackx.vcardtemp.packet.VCard;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import java.io.IOException;
- /**
- * vCard provider.
- *
- * @author Gaston Dombiak
- * @author Derek DeMoro
- * @author Chris Deering
- */
- public class VCardProvider extends IQProvider<VCard> {
- // @formatter:off
- private static final String[] ADR = new String[] {
- "POSTAL",
- "PARCEL",
- "DOM",
- "INTL",
- "PREF",
- "POBOX",
- "EXTADR",
- "STREET",
- "LOCALITY",
- "REGION",
- "PCODE",
- "CTRY",
- "FF",
- };
- private static final String[] TEL = new String[] {
- "VOICE",
- "FAX",
- "PAGER",
- "MSG",
- "CELL",
- "VIDEO",
- "BBS",
- "MODEM",
- "ISDN",
- "PCS",
- "PREF",
- };
- // @formatter:on
- @Override
- public VCard parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
- SmackException {
- VCard vCard = new VCard();
- String name = null;
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- name = parser.getName();
- switch (name) {
- case "N":
- parseName(parser, vCard);
- break;
- case "ORG":
- parseOrg(parser, vCard);
- break;
- case "TEL":
- parseTel(parser, vCard);
- break;
- case "ADR":
- parseAddress(parser, vCard);
- break;
- case "EMAIL":
- parseEmail(parser, vCard);
- break;
- case "NICKNAME":
- vCard.setNickName(parser.nextText());
- break;
- case "JABBERID":
- vCard.setJabberId(parser.nextText());
- break;
- case "PHOTO":
- parsePhoto(parser, vCard);
- break;
- default:
- break;
- }
- break;
- case XmlPullParser.TEXT:
- if (initialDepth + 1 == parser.getDepth()) {
- vCard.setField(name, parser.getText());
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- return vCard;
- }
- private static void parseAddress(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- boolean isWork = true;
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- if ("HOME".equals(name)) {
- isWork = false;
- }
- else {
- for (String adr : ADR) {
- if (adr.equals(name)) {
- if (isWork) {
- vCard.setAddressFieldWork(name, parser.nextText());
- }
- else {
- vCard.setAddressFieldHome(name, parser.nextText());
- }
- }
- }
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- }
- private static void parseTel(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- boolean isWork = true;
- String telLabel = null;
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- if ("HOME".equals(name)) {
- isWork = false;
- }
- else {
- if (telLabel != null && "NUMBER".equals(name)) {
- if (isWork) {
- vCard.setPhoneWork(telLabel, parser.nextText());
- }
- else {
- vCard.setPhoneHome(telLabel, parser.nextText());
- }
- }
- else {
- for (String tel : TEL) {
- if (tel.equals(name)) {
- telLabel = name;
- }
- }
- }
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- }
- private static void parseOrg(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- switch (name) {
- case "ORGNAME":
- vCard.setOrganization(parser.nextText());
- break;
- case "ORGUNIT":
- vCard.setOrganizationUnit(parser.nextText());
- break;
- default:
- break;
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- }
- private static void parseEmail(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- boolean isWork = false;
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- switch (name) {
- case "WORK":
- isWork = true;
- break;
- case "USERID":
- if (isWork) {
- vCard.setEmailWork(parser.nextText());
- }
- else {
- vCard.setEmailHome(parser.nextText());
- }
- break;
- default:
- break;
- }
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- default:
- break;
- }
- }
- }
- private static void parseName(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- switch (name) {
- case "FAMILY":
- vCard.setLastName(parser.nextText());
- break;
- case "GIVEN":
- vCard.setFirstName(parser.nextText());
- break;
- case "MIDDLE":
- vCard.setMiddleName(parser.nextText());
- break;
- default:
- break;
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- }
- private static void parsePhoto(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
- final int initialDepth = parser.getDepth();
- String binval = null;
- String mimetype = null;
- outerloop: while (true) {
- int eventType = parser.next();
- switch (eventType) {
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- switch (name) {
- case "BINVAL":
- binval = parser.nextText();
- break;
- case "TYPE":
- mimetype = parser.nextText();
- break;
- default:
- break;
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getDepth() == initialDepth) {
- break outerloop;
- }
- break;
- default:
- break;
- }
- }
- if (binval == null || mimetype == null) {
- return;
- }
- vCard.setAvatar(binval, mimetype);
- }
- }