VCardProvider.java

  1. /**
  2.  *
  3.  * Copyright 2003-2007 Jive Software.
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smackx.vcardtemp.provider;

  18. import org.jivesoftware.smack.SmackException;
  19. import org.jivesoftware.smack.provider.IQProvider;
  20. import org.jivesoftware.smackx.vcardtemp.packet.VCard;
  21. import org.xmlpull.v1.XmlPullParser;
  22. import org.xmlpull.v1.XmlPullParserException;

  23. import java.io.IOException;

  24. /**
  25.  * vCard provider.
  26.  *
  27.  * @author Gaston Dombiak
  28.  * @author Derek DeMoro
  29.  * @author Chris Deering
  30.  */
  31. public class VCardProvider extends IQProvider<VCard> {

  32.     // @formatter:off
  33.     private static final String[] ADR = new String[] {
  34.         "POSTAL",
  35.         "PARCEL",
  36.         "DOM",
  37.         "INTL",
  38.         "PREF",
  39.         "POBOX",
  40.         "EXTADR",
  41.         "STREET",
  42.         "LOCALITY",
  43.         "REGION",
  44.         "PCODE",
  45.         "CTRY",
  46.         "FF",
  47.     };

  48.     private static final String[] TEL = new String[] {
  49.         "VOICE",
  50.         "FAX",
  51.         "PAGER",
  52.         "MSG",
  53.         "CELL",
  54.         "VIDEO",
  55.         "BBS",
  56.         "MODEM",
  57.         "ISDN",
  58.         "PCS",
  59.         "PREF",
  60.     };
  61.     // @formatter:on

  62.     @Override
  63.     public VCard parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
  64.                     SmackException {
  65.         VCard vCard = new VCard();
  66.         String name = null;

  67.         outerloop: while (true) {
  68.             int eventType = parser.next();
  69.             switch (eventType) {
  70.             case XmlPullParser.START_TAG:
  71.                 name = parser.getName();
  72.                 switch (name) {
  73.                 case "N":
  74.                     parseName(parser, vCard);
  75.                     break;
  76.                 case "ORG":
  77.                     parseOrg(parser, vCard);
  78.                     break;
  79.                 case "TEL":
  80.                     parseTel(parser, vCard);
  81.                     break;
  82.                 case "ADR":
  83.                     parseAddress(parser, vCard);
  84.                     break;
  85.                 case "EMAIL":
  86.                     parseEmail(parser, vCard);
  87.                     break;
  88.                 case "NICKNAME":
  89.                     vCard.setNickName(parser.nextText());
  90.                     break;
  91.                 case "JABBERID":
  92.                     vCard.setJabberId(parser.nextText());
  93.                     break;
  94.                 case "PHOTO":
  95.                     parsePhoto(parser, vCard);
  96.                     break;
  97.                 default:
  98.                     break;
  99.                 }
  100.                 break;
  101.             case XmlPullParser.TEXT:
  102.                 if (initialDepth + 1 == parser.getDepth()) {
  103.                     vCard.setField(name, parser.getText());
  104.                 }
  105.                 break;
  106.             case XmlPullParser.END_TAG:
  107.                 if (parser.getDepth() == initialDepth) {
  108.                     break outerloop;
  109.                 }
  110.                 break;
  111.             default:
  112.                 break;
  113.             }
  114.         }

  115.         return vCard;
  116.     }

  117.     private static void parseAddress(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  118.         final int initialDepth = parser.getDepth();
  119.         boolean isWork = true;
  120.         outerloop: while (true) {
  121.             int eventType = parser.next();
  122.             switch (eventType) {
  123.             case XmlPullParser.START_TAG:
  124.                 String name = parser.getName();
  125.                 if ("HOME".equals(name)) {
  126.                     isWork = false;
  127.                 }
  128.                 else {
  129.                     for (String adr : ADR) {
  130.                         if (adr.equals(name)) {
  131.                             if (isWork) {
  132.                                 vCard.setAddressFieldWork(name, parser.nextText());
  133.                             }
  134.                             else {
  135.                                 vCard.setAddressFieldHome(name, parser.nextText());
  136.                             }
  137.                         }
  138.                     }
  139.                 }
  140.                 break;
  141.             case XmlPullParser.END_TAG:
  142.                 if (parser.getDepth() == initialDepth) {
  143.                     break outerloop;
  144.                 }
  145.                 break;
  146.             default:
  147.                 break;
  148.             }
  149.         }
  150.     }

  151.     private static void parseTel(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  152.         final int initialDepth = parser.getDepth();
  153.         boolean isWork = true;
  154.         String telLabel = null;

  155.         outerloop: while (true) {
  156.             int eventType = parser.next();
  157.             switch (eventType) {
  158.             case XmlPullParser.START_TAG:
  159.                 String name = parser.getName();
  160.                 if ("HOME".equals(name)) {
  161.                     isWork = false;
  162.                 }
  163.                 else {
  164.                     if (telLabel != null && "NUMBER".equals(name)) {
  165.                         if (isWork) {
  166.                             vCard.setPhoneWork(telLabel, parser.nextText());
  167.                         }
  168.                         else {
  169.                             vCard.setPhoneHome(telLabel, parser.nextText());
  170.                         }
  171.                     }
  172.                     else {
  173.                         for (String tel : TEL) {
  174.                             if (tel.equals(name)) {
  175.                                 telLabel = name;
  176.                             }
  177.                         }
  178.                     }
  179.                 }
  180.                 break;
  181.             case XmlPullParser.END_TAG:
  182.                 if (parser.getDepth() == initialDepth) {
  183.                     break outerloop;
  184.                 }
  185.                 break;
  186.             default:
  187.                 break;
  188.             }
  189.         }
  190.     }

  191.     private static void parseOrg(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  192.         final int initialDepth = parser.getDepth();

  193.         outerloop: while (true) {
  194.             int eventType = parser.next();
  195.             switch (eventType) {
  196.             case XmlPullParser.START_TAG:
  197.                 String name = parser.getName();
  198.                 switch (name) {
  199.                 case "ORGNAME":
  200.                     vCard.setOrganization(parser.nextText());
  201.                     break;
  202.                 case "ORGUNIT":
  203.                     vCard.setOrganizationUnit(parser.nextText());
  204.                     break;
  205.                 default:
  206.                     break;
  207.                 }
  208.                 break;
  209.             case XmlPullParser.END_TAG:
  210.                 if (parser.getDepth() == initialDepth) {
  211.                     break outerloop;
  212.                 }
  213.                 break;
  214.             default:
  215.                 break;
  216.             }
  217.         }
  218.     }

  219.     private static void parseEmail(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  220.         final int initialDepth = parser.getDepth();
  221.         boolean isWork = false;

  222.         outerloop: while (true) {
  223.             int eventType = parser.next();
  224.             switch (eventType) {
  225.             case XmlPullParser.START_TAG:
  226.                 String name = parser.getName();
  227.                 switch (name) {
  228.                 case "WORK":
  229.                     isWork = true;
  230.                     break;
  231.                 case "USERID":
  232.                     if (isWork) {
  233.                         vCard.setEmailWork(parser.nextText());
  234.                     }
  235.                     else {
  236.                         vCard.setEmailHome(parser.nextText());
  237.                     }
  238.                     break;
  239.                 default:
  240.                     break;
  241.                 }
  242.             case XmlPullParser.END_TAG:
  243.                 if (parser.getDepth() == initialDepth) {
  244.                     break outerloop;
  245.                 }
  246.             default:
  247.                 break;
  248.             }
  249.         }
  250.     }

  251.     private static void parseName(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  252.         final int initialDepth = parser.getDepth();

  253.         outerloop: while (true) {
  254.             int eventType = parser.next();
  255.             switch (eventType) {
  256.             case XmlPullParser.START_TAG:
  257.                 String name = parser.getName();
  258.                 switch (name) {
  259.                 case "FAMILY":
  260.                     vCard.setLastName(parser.nextText());
  261.                     break;
  262.                 case "GIVEN":
  263.                     vCard.setFirstName(parser.nextText());
  264.                     break;
  265.                 case "MIDDLE":
  266.                     vCard.setMiddleName(parser.nextText());
  267.                     break;
  268.                 default:
  269.                     break;
  270.                 }
  271.                 break;
  272.             case XmlPullParser.END_TAG:
  273.                 if (parser.getDepth() == initialDepth) {
  274.                     break outerloop;
  275.                 }
  276.                 break;
  277.             default:
  278.                 break;

  279.             }
  280.         }
  281.     }

  282.     private static void parsePhoto(XmlPullParser parser, VCard vCard) throws XmlPullParserException, IOException {
  283.         final int initialDepth = parser.getDepth();
  284.         String binval = null;
  285.         String mimetype = null;

  286.         outerloop: while (true) {
  287.             int eventType = parser.next();
  288.             switch (eventType) {
  289.             case XmlPullParser.START_TAG:
  290.                 String name = parser.getName();
  291.                 switch (name) {
  292.                 case "BINVAL":
  293.                     binval = parser.nextText();
  294.                     break;
  295.                 case "TYPE":
  296.                     mimetype = parser.nextText();
  297.                     break;
  298.                 default:
  299.                     break;
  300.                 }
  301.                 break;
  302.             case XmlPullParser.END_TAG:
  303.                 if (parser.getDepth() == initialDepth) {
  304.                     break outerloop;
  305.                 }
  306.                 break;
  307.             default:
  308.                 break;
  309.             }
  310.         }

  311.         if (binval == null || mimetype == null) {
  312.             return;
  313.         }

  314.         vCard.setAvatar(binval, mimetype);
  315.     }
  316. }