001/**
002 *
003 * Copyright 2015-2016 Ishan Khanna
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jivesoftware.smackx.geoloc.provider;
018
019import java.io.IOException;
020import java.net.URISyntaxException;
021import java.text.ParseException;
022
023import org.jivesoftware.smack.provider.ExtensionElementProvider;
024import org.jivesoftware.smack.util.ParserUtils;
025import org.jivesoftware.smackx.geoloc.packet.GeoLocation;
026import org.xmlpull.v1.XmlPullParser;
027import org.xmlpull.v1.XmlPullParserException;
028
029public class GeoLocationProvider extends ExtensionElementProvider<GeoLocation> {
030
031    @Override
032    public GeoLocation parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
033                    ParseException, URISyntaxException {
034
035        GeoLocation.Builder builder = GeoLocation.builder();
036
037        outerloop: while (true) {
038            int event = parser.next();
039            switch (event) {
040            case XmlPullParser.START_TAG:
041                String name = parser.getName();
042                switch (name) {
043                case "accuracy":
044                    builder.setAccuracy(ParserUtils.getDoubleFromNextText(parser));
045                    break;
046                case "alt":
047                    builder.setAlt(ParserUtils.getDoubleFromNextText(parser));
048                    break;
049                case "area":
050                    builder.setArea(parser.nextText());
051                    break;
052                case "bearing":
053                    builder.setBearing(ParserUtils.getDoubleFromNextText(parser));
054                    break;
055                case "building":
056                    builder.setBuilding(parser.nextText());
057                    break;
058                case "country":
059                    builder.setCountry(parser.nextText());
060                    break;
061                case "countrycode":
062                    builder.setCountryCode(parser.nextText());
063                    break;
064                case "datum":
065                    builder.setDatum(parser.nextText());
066                    break;
067                case "description":
068                    builder.setDescription(parser.nextText());
069                    break;
070                case "error":
071                    builder.setError(ParserUtils.getDoubleFromNextText(parser));
072                    break;
073                case "floor":
074                    builder.setFloor(parser.nextText());
075                    break;
076                case "lat":
077                    builder.setLat(ParserUtils.getDoubleFromNextText(parser));
078                    break;
079                case "locality":
080                    builder.setLocality(parser.nextText());
081                    break;
082                case "lon":
083                    builder.setLon(ParserUtils.getDoubleFromNextText(parser));
084                    break;
085                case "postalcode":
086                    builder.setPostalcode(parser.nextText());
087                    break;
088                case "region":
089                    builder.setRegion(parser.nextText());
090                    break;
091                case "room":
092                    builder.setRoom(parser.nextText());
093                    break;
094                case "speed":
095                    builder.setSpeed(ParserUtils.getDoubleFromNextText(parser));
096                    break;
097                case "street":
098                    builder.setStreet(parser.nextText());
099                    break;
100                case "text":
101                    builder.setText(parser.nextText());
102                    break;
103                case "timestamp":
104                    builder.setTimestamp(ParserUtils.getDateFromNextText(parser));
105                    break;
106                case "tzo":
107                    builder.setTzo(parser.nextText());
108                    break;
109                case "uri":
110                    builder.setUri(ParserUtils.getUriFromNextText(parser));
111                    break;
112                }
113                break;
114            case XmlPullParser.END_TAG:
115                if (parser.getDepth() == initialDepth) {
116                    break outerloop;
117                }
118            }
119        }
120
121        return builder.build();
122    }
123
124}