/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* weather-met.c - UK Met Office forecast source * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see * . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE #include "weather.h" #include "weather-priv.h" static char * met_reprocess (char *x, int len) { char *p = x; char *o; int spacing = 0; static gchar *buf; static gint buflen = 0; gchar *lastspace = NULL; int count = 0; if (buflen < len) { if (buf) g_free (buf); buf = g_malloc (len + 1); buflen = len; } o = buf; x += len; /* End mark */ while (*p && p < x) { if (g_ascii_isspace (*p)) { if (!spacing) { spacing = 1; lastspace = o; count++; *o++ = ' '; } p++; continue; } spacing = 0; if (count > 75 && lastspace) { count = o - lastspace - 1; *lastspace = '\n'; lastspace = NULL; } if (*p == '&') { if (g_ascii_strncasecmp (p, "&", 5) == 0) { *o++ = '&'; count++; p += 5; continue; } if (g_ascii_strncasecmp (p, "<", 4) == 0) { *o++ = '<'; count++; p += 4; continue; } if (g_ascii_strncasecmp (p, ">", 4) == 0) { *o++ = '>'; count++; p += 4; continue; } } if (*p == '<') { if (g_ascii_strncasecmp (p, "
", 4) == 0) { *o++ = '\n'; count = 0; } if (g_ascii_strncasecmp (p, "", 3) == 0) { *o++ = '\n'; *o++ = '\n'; count = 0; } p++; while (*p && *p != '>') p++; if (*p) p++; continue; } *o++ = *p++; count++; } *o = 0; return buf; } /* * Parse the metoffice forecast info. * For mate 3.0 we want to just embed an HTML matecomponent component and * be done with this ;) */ static gchar * met_parse (const gchar *meto) { gchar *p; gchar *rp; gchar *r = g_strdup ("Met Office Forecast\n"); gchar *t; g_return_val_if_fail (meto != NULL, r); p = strstr (meto, "Summary: "); g_return_val_if_fail (p != NULL, r); rp = strstr (p, "Text issued at:"); g_return_val_if_fail (rp != NULL, r); p += 13; /* p to rp is the text block we want but in HTML malformat */ t = g_strconcat (r, met_reprocess (p, rp - p), NULL); g_free (r); return t; } static void met_finish (SoupSession *session, SoupMessage *msg, gpointer data) { WeatherInfo *info = (WeatherInfo *)data; g_return_if_fail (info != NULL); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { g_warning ("Failed to get Met Office forecast data: %d %s.\n", msg->status_code, msg->reason_phrase); request_done (info, FALSE); return; } info->forecast = met_parse (msg->response_body->data); request_done (info, TRUE); } void metoffice_start_open (WeatherInfo *info) { gchar *url; SoupMessage *msg; WeatherLocation *loc; loc = info->location; url = g_strdup_printf ("http://www.metoffice.gov.uk/weather/europe/uk/%s.html", loc->zone + 1); msg = soup_message_new ("GET", url); soup_session_queue_message (info->session, msg, met_finish, info); g_free (url); info->requests_pending++; }