001/* 002 * 003 * Copyright 2015-2017 Ishan Khanna, Fernando Ramirez, 2019-2021 Florian Schmaus 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.text.ParseException; 021 022import javax.xml.namespace.QName; 023 024import org.jivesoftware.smack.packet.XmlEnvironment; 025import org.jivesoftware.smack.parsing.SmackParsingException; 026import org.jivesoftware.smack.parsing.SmackParsingException.SmackUriSyntaxParsingException; 027import org.jivesoftware.smack.provider.ExtensionElementProvider; 028import org.jivesoftware.smack.util.ParserUtils; 029import org.jivesoftware.smack.xml.XmlPullParser; 030import org.jivesoftware.smack.xml.XmlPullParserException; 031 032import org.jivesoftware.smackx.geoloc.packet.GeoLocation; 033import org.jivesoftware.smackx.xdata.provider.FormFieldChildElementProvider; 034 035import org.jxmpp.JxmppContext; 036 037public class GeoLocationProvider extends ExtensionElementProvider<GeoLocation> { 038 039 public static final GeoLocationProvider INSTANCE = new GeoLocationProvider(); 040 041 @Override 042 public GeoLocation parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment, JxmppContext jxmppContext) throws XmlPullParserException, IOException, 043 SmackUriSyntaxParsingException, ParseException { 044 045 GeoLocation.Builder builder = GeoLocation.builder(); 046 047 outerloop: while (true) { 048 XmlPullParser.Event event = parser.next(); 049 switch (event) { 050 case START_ELEMENT: 051 String name = parser.getName(); 052 switch (name) { 053 case "accuracy": 054 builder.setAccuracy(ParserUtils.getDoubleFromNextText(parser)); 055 break; 056 case "alt": 057 builder.setAlt(ParserUtils.getDoubleFromNextText(parser)); 058 break; 059 case "altaccuracy": 060 builder.setAltAccuracy(ParserUtils.getDoubleFromNextText(parser)); 061 break; 062 case "area": 063 builder.setArea(parser.nextText()); 064 break; 065 case "bearing": 066 builder.setBearing(ParserUtils.getDoubleFromNextText(parser)); 067 break; 068 case "building": 069 builder.setBuilding(parser.nextText()); 070 break; 071 case "country": 072 builder.setCountry(parser.nextText()); 073 break; 074 case "countrycode": 075 builder.setCountryCode(parser.nextText()); 076 break; 077 case "datum": 078 builder.setDatum(parser.nextText()); 079 break; 080 case "description": 081 builder.setDescription(parser.nextText()); 082 break; 083 case "error": 084 parseError(builder, parser); 085 break; 086 case "floor": 087 builder.setFloor(parser.nextText()); 088 break; 089 case "lat": 090 builder.setLat(ParserUtils.getDoubleFromNextText(parser)); 091 break; 092 case "locality": 093 builder.setLocality(parser.nextText()); 094 break; 095 case "lon": 096 builder.setLon(ParserUtils.getDoubleFromNextText(parser)); 097 break; 098 case "postalcode": 099 builder.setPostalcode(parser.nextText()); 100 break; 101 case "region": 102 builder.setRegion(parser.nextText()); 103 break; 104 case "room": 105 builder.setRoom(parser.nextText()); 106 break; 107 case "speed": 108 builder.setSpeed(ParserUtils.getDoubleFromNextText(parser)); 109 break; 110 case "street": 111 builder.setStreet(parser.nextText()); 112 break; 113 case "text": 114 builder.setText(parser.nextText()); 115 break; 116 case "timestamp": 117 builder.setTimestamp(ParserUtils.getDateFromNextText(parser)); 118 break; 119 case "tzo": 120 builder.setTzo(parser.nextText()); 121 break; 122 case "uri": 123 builder.setUri(ParserUtils.getUriFromNextText(parser)); 124 break; 125 } 126 break; 127 case END_ELEMENT: 128 if (parser.getDepth() == initialDepth) { 129 break outerloop; 130 } 131 break; 132 default: 133 // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement. 134 break; 135 } 136 } 137 138 return builder.build(); 139 } 140 141 @SuppressWarnings("deprecation") 142 private static void parseError(GeoLocation.Builder builder, XmlPullParser parser) throws XmlPullParserException, IOException { 143 double error = ParserUtils.getDoubleFromNextText(parser); 144 builder.setError(error); 145 } 146 147 public static class GeoLocationFormFieldChildElementProvider extends FormFieldChildElementProvider<GeoLocation> { 148 149 public static final GeoLocationFormFieldChildElementProvider INSTANCE = new GeoLocationFormFieldChildElementProvider(); 150 151 @Override 152 public QName getQName() { 153 return GeoLocation.QNAME; 154 } 155 156 @Override 157 public GeoLocation parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment, JxmppContext jxmppContext) 158 throws XmlPullParserException, IOException, SmackParsingException, ParseException { 159 return GeoLocationProvider.INSTANCE.parse(parser, initialDepth, xmlEnvironment, null); 160 } 161 162 } 163 164}