Susanna Huhtanen ihmis.suski@gmail.com 2012 Daniel Mustieles daniel.mustieles@gmail.com 2011 - 2017 Nicolás Satragno nsatragno@gmail.com 2012 - 2013 Jorge González jorgegonz@svn.gnome.org 2011 Biblioteca local geoNames

En esta parte de la guía se construirá la biblioteca local geoNames usando llamadas asíncronas. En este ejemplo, la información del clima se obtiene de geonames.org y la aplicación usa los códigos ICAO para responder a las peticiones. Para escribir y ejecutar todos los ejemplos de código necesita un editor de texto en el que escribir el código, una terminal y GNOME 3 o superior instalado en su equipo. En esta guía se verán las siguientes partes:

Biblioteca local para obtener el clima

Crear la función «geoNames»

Métodos para «geoNames»

geonames.js

Biblioteca local para obtener el clima

Para esto se necesita un archivo nueva que será nuestra biblioteca local.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());

En las primeras líneas se importan y se inicializan las bibliotecas que necesitamos usar en esta biblioteca local. Soup maneja todas las peticiones que se hagan con http.

Crear la función geoNames function GeoNames(station) { this.station = station; } GeoNames.prototype = { }

Aquí se crea la función GeoNames, que manejará la obtención del clima. JavaScript permite crear funciones sencillas al principio para ampliarlas más tarde. Esto se hará dentro de las llaves de GeoNames.prototype.

Métodos para geoNames getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); }, getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; }

El primer método de GeoNames es getWeather, y el segundo es getIcon. En getWeather se realiza una solicitud http con soup, se gestionan los errores y se analiza la información de la solicitud para saber que se puede usar. En getIcon simplemente se comparan los resultados obtenidos en getWeather con el selector para obtener el icono que representa el clima actual. Ahora que la biblioteca local está lista, es el momento de usarla.

geonames.js

Aquí está el código completo de la biblioteca. El archivo de programa principal la llama de manera asíncrona.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); function GeoNames(station) { this.station = station; } GeoNames.prototype = { getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); }, getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; } } }