/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 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 representation of the PacketExtension.
*
* @return the packet extension as XML.
*/
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("</").append(getElementName()).append(">");
return buf.toString();
}
/**
* Creates the xml <tt>String</tt> corresponding to the specified element
* and value and addsthem to the <tt>buff</tt> StringBuffer.
*
* @param buff the <tt>StringBuffer</tt> 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 <tt>StringBuffer</tt> 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("</").
append(element).append(">");
}
return buff;
}
/**
* Creates the xml <tt>String</tt> corresponding to the specified element
* and its float value and adds them to the <tt>buf</tt>
* <tt>StringBuffer</tt>.
*
* @param buff the <tt>StringBuffer</tt> 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 <tt>StringBuffer</tt> 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("</").
append(element).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 <tt>java.lang.String</tt> 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 <tt>java.lang.String</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>float</tt> 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 <tt>float</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>float</tt> 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 <tt>float</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> indicating a particular room in a building.
*
* @return a <tt>String</tt> 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 <tt>String</tt> indicating the name ornumber a particular
* room in a building (e.g. C-425).
*/
public void setRoom(String room)
{
this.room = room;
}
/**
* Returns a <tt>String</tt> indicating a thoroughfare within a locality,
* or a crossing of two thoroughfares.
*
* @return a <tt>String</tt> 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 <tt>String</tt> 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 <tt>String</tt> stored in the "Text" element of the geolocation
* details.
*
* @return a <tt>String</tt> stored in the "Text" element of the geolocation
* details.
*/
public String getText()
{
return text;
}
/**
* Sets a <tt>String</tt> to store in the "Text" element of the geolocation
* details.
*
* @param text a <tt>String</tt> stored in the "Text" element of the
* geolocation details.
*/
public void setText(String text)
{
this.text = text;
}
/**
* Returns a <tt>String</tt> containing a UTC timestamp specifying the
* moment when the reading was taken.
*
* @return a <tt>String</tt> 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;
}
}
}