diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/geolocation/GeolocationPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/geolocation/GeolocationPacketExtension.java new file mode 100644 index 000000000..9dfd466e4 --- /dev/null +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/geolocation/GeolocationPacketExtension.java @@ -0,0 +1,835 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.protocol.jabber.extensions.geolocation; + +import org.jivesoftware.smack.packet.*; + +/** + * This class implements the Geolocation Extension defined in the XEP-0080 + * + * @author Guillaume Schreiner + */ +public class GeolocationPacketExtension + implements PacketExtension +{ + //Names of keys used for storing geolocation data in geolocation Maps. + + /** + * The name of the geolocation map key corresponding to the altitude in + * meters above or below sea level (e.g. 1609). + */ + public final static String ALT = "alt"; + + /** + * The name of the geolocation map key that we use for storing named areas + * such as a campus or neighborhood (e.g. Central Park). + */ + public final static String AREA = "area"; + + /** + * The name of the geolocation map key that we use for storing GPS bearing + * (direction in which the entity is heading to reach its next waypoint), + * measured in decimal degrees relative to true north. + */ + public final static String BEARING = "bearing"; + + /** + * The name of the geolocation map key that we use for indicating a + * specific building on a street or in an area (e.g. The Empire State + * Building). + */ + public final static String BUILDING = "building"; + + /** + * The name of the geolocation map key that we use for indicating the + * nation where the user is located (e.g. Greenland). + */ + public final static String COUNTRY = "country"; + + /** + * GPS datum. + */ + public final static String DATUM = "datum"; + + /** + * The name of the geolocation map key that we use for storing a + * natural-language name for or description of a given location (e.g. + * Bill's house). + */ + public final static String DESCRIPTION = "description"; + + /** + * The name of the geolocation map key that we use for storing horizontal + * GPS errors in arc minutes (e.g. 10). + */ + public final static String ERROR = "error"; + + /** + * The name of the geolocation map key that we use for storing a particular + * floor in a building (e.g. 102). + */ + public final static String FLOOR = "floor"; + + /** + * The name of the geolocation map key that we use for storing geographic + * latitude in decimal degrees North (e.g. 39.75). + */ + public final static String LAT = "lat"; + + /** + * The name of the geolocation map key that we use for indicating a + * locality within the administrative region, such as a town or city (e.g. + * Paris). + */ + public final static String LOCALITY = "locality"; + + /** + * The name of the geolocation map key that we use for indicating + * longitude in decimal degrees East (e.g. -104.99). + */ + public final static String LON = "lon"; + + /** + * The name of the geolocation map key that we use for storing post codes + * (or any code used for postal delivery) (e.g. 67000). + */ + public final static String POSTALCODE = "postalcode"; + + /** + * The name of the geolocation map key that we use for indicating an + * administrative region of the nation, such as a state or province (e.g. + * Ile de France). + */ + public final static String REGION = "region"; + + /** + * The name of the geolocation map key that we use for indicating a + * particular room in a building (e.g. C-425). + */ + public final static String ROOM = "room"; + + /** + * The name of the geolocation map key that we use for storing a + * thoroughfare within a locality, or a crossing of two thoroughfares (e.g. + * 34th and Broadway). + */ + public final static String STREET = "street"; + + /** + * The name of the geolocation map key that we use to indicate a catch-all + * element that captures any other information about the location (e.g. + * North-West corner of the lobby). + */ + public final static String TEXT = "text"; + + /** + * The name of the geolocation map key that we use to indicate UTC + * timestamp specifying the moment when the reading was taken + * (e.g. 2007-05-27T21:12Z). + */ + public final static String TIMESTAMP = "timestamp"; + + /** + * Altitude in meters above or below sea level + * example: 1609 + */ + private float alt = -1; + + /** + * A named area such as a campus or neighborhood + * example: Central Park + */ + private String area = null; + + /** + * GPS bearing (direction in which the entity is heading to reach its + * next waypoint), measured in decimal degrees relative to true north + */ + private float bearing = -1; + + /** + * A specific building on a street or in an area + * example: The Empire State Building + */ + private String building = null; + + /** + * The nation where the user is located + * example: USA + */ + private String country = null; + + /** + * GPS datum + */ + private String datum = null; + + /** + * A natural-language name for or description of the location + * example: Bill's house + */ + private String description = null; + + /** + * Horizontal GPS error in arc minutes + * example: 10 + */ + private float error = -1; + + /** + * A particular floor in a building + * example: 102 + */ + private String floor = null; + + /** + * Latitude in decimal degrees North + * example: 39.75 + */ + private float lat = -1; + + /** + * A locality within the administrative region, such as a town or city + * example: New York City + */ + private String locality = null; + + /** + * Longitude in decimal degrees East + * example: -104.99 + */ + private float lon = -1; + + /** + * A code used for postal delivery + * example: 10027 + */ + private String postalcode = null; + + /** + * An administrative region of the nation, such as a state or province + * example: New York + */ + private String region = null; + + /** + * A particular room in a building + * example: Observatory + */ + private String room = null; + + /** + * A thoroughfare within the locality, or a crossing of two thoroughfares + * example: 34th and Broadway + */ + private String street = null; + + /** + * A catch-all element that captures any other information about the location + * example: Northwest corner of the lobby + */ + private String text = null; + + /** + * UTC timestamp specifying the moment when the reading was taken + * example: 2004-02-19T21:12Z + */ + private String timestamp = null; + + /** + * Returns the XML reppresentation of the PacketExtension. + * + * @return the packet extension as XML. + * @todo Implement this org.jivesoftware.smack.packet.PacketExtension + * method + */ + public String toXML() + { + StringBuffer buf = new StringBuffer(); + + // open extension + buf.append("<").append(getElementName()). + append(" xmlns=\"").append(getNamespace()).append("\">"); + + // adding geolocation extension parameters + buf = addFloatXmlElement(buf, ALT, this.getAlt()); + buf = addXmlElement(buf, AREA, this.getArea()); + buf = addFloatXmlElement(buf, BEARING, this.getBearing()); + buf = addXmlElement(buf, BUILDING, this.getBuilding()); + buf = addXmlElement(buf, COUNTRY, this.getCountry()); + buf = addXmlElement(buf, DATUM, this.getDatum()); + buf = addXmlElement(buf, DESCRIPTION, this.getDescription()); + buf = addFloatXmlElement(buf, ERROR, this.getError()); + buf = addXmlElement(buf, FLOOR, this.getFloor()); + buf = addFloatXmlElement(buf, LAT, this.getLat()); + buf = addXmlElement(buf, LOCALITY, this.getLocality()); + buf = addFloatXmlElement(buf, LON, this.getLon()); + buf = addXmlElement(buf, POSTALCODE, this.getPostalCode()); + buf = addXmlElement(buf, REGION, this.getRegion()); + buf = addXmlElement(buf, ROOM, this.getRoom()); + buf = addXmlElement(buf, STREET, this.getStreet()); + buf = addXmlElement(buf, TEXT, this.getText()); + buf = addXmlElement(buf, TIMESTAMP, this.getTimestamp()); + + // close extension + buf.append(""); + + return buf.toString(); + } + + /** + * Creates the xml String corresponding to the specified element + * and value and addsthem to the buff StringBuffer. + * + * @param buff the StringBuffer to add the element and value to. + * @param element the name of the geolocation element that we're adding. + * @param value the value of the element we're addding to the xml buffer. + * @return the StringBuffer that we've added the element and its + * value to. + */ + private StringBuffer addXmlElement(StringBuffer buff, + String element, + String value) + { + if (value != null) + { + buff.append("<"). + append(element).append(">"). + append(value).append(""); + } + + return buff; + } + + /** + * Creates the xml String corresponding to the specified element + * and its float value and adds them to the buf + * StringBuffer. + * + * @param buff the StringBuffer to add the element and value to. + * @param element the name of the geolocation element that we're adding. + * @param value the float value of the element we're addding to the xml + * buffer. + * @return the StringBuffer that we've added the element and its + * value to. + */ + private StringBuffer addFloatXmlElement(StringBuffer buff, + String element, + float value) + { + + if (value != -1) + { + buff.append("<"). + append(element).append(">"). + append(value).append(""); + } + + return buff; + } + + /** + * Returns the XML element name of the extension sub-packet root element. + * The current implementation would always return "geoloc". + * + * @return the XML element name of the packet extension. + */ + public String getElementName() + { + return GeolocationPacketExtensionProvider.ELEMENT_NAME; + } + + /** + * Returns the XML namespace of the extension sub-packet root element. + * The namespace is always "http://jabber.org/protocol/geoloc" + * + * @return the XML namespace of the packet extension. + */ + public String getNamespace() + { + return GeolocationPacketExtensionProvider.NAMESPACE; + } + + /** + * Returns altitude in meters above or below sea level. + * + * @return the altitude in meters above or belos sea level (e.g. 1609). + */ + public float getAlt() + { + return alt; + } + + /** + * Sets the altitude in meters above or below sea level. + * + * @param alt the altitude in meters above or belos sea level (e.g. 1609). + */ + public void setAlt(float alt) + { + this.alt = alt; + } + + /** + * Sets the altitude in meters above or below sea level. + * + * @param alt the altitude in meters above or belos sea level (e.g. 1609). + */ + public void setAlt(String alt) + { + this.alt = (new Float(alt)).floatValue(); + } + + /** + * A named area such as a campus or neighborhood. + * + * @return a String indicating a named area such as a campus or a + * neighborhood (e.g. Central Park). + */ + public String getArea() + { + return area; + } + + /** + * Sets the value of a named area such as a campus or neighborhood. + * + * @param area the value of a named area such as a campus or neighborhood. + */ + public void setArea(String area) + { + this.area = area; + } + + /** + * Returns GPS bearing (direction in which the entity is heading to reach + * its next waypoint), measured in decimal degrees relative to true north. + * + * @return a float value indicating GPS bearing (direction in which the + * entity is heading to reach its next waypoint), measured in decimal + * degrees relative to true north. + */ + public float getBearing() + { + return bearing; + } + + /** + * Sets GPS bearing (direction in which the entity is heading to reach + * its next waypoint), measured in decimal degrees relative to true north. + * + * @param bearing a float value indicating GPS bearing (direction in which + * the entity is heading to reach its next waypoint), measured in decimal + * degrees relative to true north. + */ + public void setBearing(float bearing) + { + this.bearing = bearing; + } + + /** + * Sets GPS bearing (direction in which the entity is heading to reach + * its next waypoint), measured in decimal degrees relative to true north. + * + * @param bearing a String value indicating GPS bearing (direction in which + * the entity is heading to reach its next waypoint), measured in decimal + * degrees relative to true north. + */ + public void setBearing(String bearing) + { + this.bearing = (new Float(bearing)).floatValue(); + } + + /** + * Returns the name of a specific building on a street or in an area. + * + * @return a String containing the name of a specific building on a street + * or in an area (e.g. The Empire State Building). + */ + public String getBuilding() + { + return building; + } + + /** + * Sets the name of a specific building on a street or in an area. + * + * @param building a String indicating the name of a specific building on + * a street or in an area (e.g. The Empire State Building). + */ + public void setBuilding(String building) + { + this.building = building; + } + + /** + * Return the nation where the user is located. + * + * @return a String containing the name of the nation where the user is + * located (e.g. Greenland). + */ + public String getCountry() + { + return country; + } + + /** + * Sets the name of the nation where the user is located. + * + * @param country a String containing the name of the nation where the user + * is located (e.g. Greenland). + */ + public void setCountry(String country) + { + this.country = country; + } + + /** + * Return the value of GPS Datum. + * + * @return a String containing the value of GPS Datum. + */ + public String getDatum() + { + return datum; + } + + /** + * Sets the value of GPS Datum. + * + * @param datum the value of GPS Datum. + */ + public void setDatum(String datum) + { + this.datum = datum; + } + + /** + * Returns a natural-language name for or description of a this location. + * + * @return a java.lang.String containing a natural-language + * description of this location (e.g. Bill's house) + */ + public String getDescription() + { + return description; + } + + /** + * Sets a natural-language name for or description of a this location. + * + * @param description a java.lang.String containing a + * natural-language description of this location (e.g. Bill's house) + */ + public void setDescription(String description) + { + this.description = description; + } + + /** + * Returns horizontal GPS errors in arc minutes. + * + * @return a float indicating horizontal GPS errors in arc minutes + * (e.g. 10). + */ + public float getError() + { + return error; + } + + /** + * Sets the value of horizontal GPS errors in arc minutes. + * @param error a float indicating horizontal GPS errors in arc minutes + * (e.g. 10). + */ + public void setError(float error) + { + this.error = error; + } + + /** + * Sets the value of horizontal GPS errors in arc minutes. + * @param error a String indicating horizontal GPS errors in arc minutes + * (e.g. 10). + */ + public void setError(String error) + { + this.error = (new Float(error)).floatValue(); + } + + /** + * The number or name of a a particular floor in a building. + * + * @return a String indicating the number or name of a particular + * floor in a building (e.g. 102) + */ + public String getFloor() + { + return floor; + } + + /** + * Sets the number or name of a a particular floor in a building. + * + * @param floor a String indicating the number or name of a + * particular floor in a building (e.g. 102) + */ + public void setFloor(String floor) + { + this.floor = floor; + } + + /** + * Returns geographic latitude in decimal degrees North. + * + * @return a float value indicating geographic latitude in decimal + * degrees (e.g. 39.75). + */ + public float getLat() + { + return lat; + } + + /** + * Sets geographic latitude in decimal degrees North. + * + * @param lat a float value indicating geographic latitude in + * decimal degrees (e.g. 39.75). + */ + public void setLat(float lat) + { + this.lat = lat; + } + + /** + * Sets geographic latitude in decimal degrees North. + * + * @param lat a String value indicating geographic latitude in + * decimal degrees (e.g. 39.75). + */ + public void setLat(String lat) + { + this.lat = (new Float(lat)).floatValue(); + } + + /** + * Returns a locality within the administrative region, such as a town or + * city. + * + * @return a String indicating a locality within the administrative + * region (e.g. Paris). + */ + public String getLocality() + { + return locality; + } + + /** + * Sets a locality within the administrative region, such as a town or + * city. + * + * @param locality a String indicating a locality within the + * administrative region (e.g. Paris). + */ + public void setLocality(String locality) + { + this.locality = locality; + } + + /** + * Returns a float containing the longitude in decimal degrees East + * (e.g. -104.99). + * + * @return a float containing the longitude in decimal degrees East + * (e.g. -104.99). + */ + public float getLon() + { + return lon; + } + + /** + * Sets the longitude in decimal degrees East. + * + * @param lon a float containing the longitude in decimal degrees + * East (e.g. -104.99). + */ + public void setLon(float lon) + { + this.lon = lon; + } + + /** + * Sets the longitude in decimal degrees East. + * + * @param lon a String containing the longitude in decimal degrees + * East (e.g. -104.99). + */ + public void setLon(String lon) + { + this.lon = (new Float(lon)).floatValue(); + } + + /** + * Returns a postal code (or any code used for postal delivery). + * + * @return a String containing the value of a postal or zip code + * (e.g. 67000). + */ + public String getPostalCode() + { + return postalcode; + } + + /** + * Sets a postal code (or any code used for postal delivery). + * + * @param postalCode a String containing the value of a postal or + * zip code (e.g. 67000). + */ + public void setPostalCode(String postalCode) + { + this.postalcode = postalCode; + } + + /** + * Returns an administrative region of the nation, such as a state or + * province (e.g. Ile de France). + * + * @return a String indicating an administrative region of the + * nation, such as a state or province (e.g. Ile de France). + */ + public String getRegion() + { + return region; + } + + /** + * Sets an administrative region of the nation, such as a state or + * province (e.g. Ile de France). + * + * @param region a String indicating an administrative region of + * the nation, such as a state or province (e.g. Ile de France). + */ + public void setRegion(String region) + { + this.region = region; + } + + /** + * Returns a String indicating a particular room in a building. + * + * @return a String indicating a particular room in a building + * (e.g. C-425). + */ + public String getRoom() + { + return room; + } + + /** + * Sets the name or number indicating a particular room in a building. + * + * @param room a String indicating the name ornumber a particular + * room in a building (e.g. C-425). + */ + public void setRoom(String room) + { + this.room = room; + } + + /** + * Returns a String indicating a thoroughfare within a locality, + * or a crossing of two thoroughfares. + * + * @return a String indicating a thoroughfare within a locality, + * or a crossing of two thoroughfares (e.g. 34th and Broadway). + */ + public String getStreet() + { + return street; + } + + /** + * Sets the name of a street. + * + * @param street a String indicating a thoroughfare within a + * locality, or a crossing of two thoroughfares (e.g. 34th and Broadway). + */ + public void setStreet(String street) + { + this.street = street; + } + + /** + * Returns a String stored in the "Text" element of the geolocation + * details. + * + * @return a String stored in the "Text" element of the geolocation + * details. + */ + public String getText() + { + return text; + } + + /** + * Sets a String to store in the "Text" element of the geolocation + * details. + * + * @param text a String stored in the "Text" element of the + * geolocation details. + */ + public void setText(String text) + { + this.text = text; + } + + /** + * Returns a String containing a UTC timestamp specifying the + * moment when the reading was taken. + * + * @return a String containing a UTC timestamp specifying the + * moment when the reading was taken (e.g. 2007-05-27T21:12Z). + */ + public String getTimestamp() + { + return timestamp; + } + + /** + * Set timestamp in UTC format as described in XEP-0082: XMPP Date and + * Time Profiles + * + * @param timestamp the timestamp in UTC format (e.g. 2007-05-27T21:12Z). + */ + public void setTimestamp(String timestamp) + { + this.timestamp = timestamp; + } + + /** + * Test if latitude and longitude are set. + * + * @return true if the geolocation extension contains both latitude and + * longitude and false otherwise. + */ + public boolean containsLatLon() + { + + if (this.lat != -1 && this.lon != -1) + { + return true; + } + else + { + return false; + } + } +}