Updated weather plugin to use the new plugin API.
authorPiotr Sipika <Piotr.Sipika@gmail.com>
Sat, 5 Jul 2014 00:17:47 +0000 (20:17 -0400)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Fri, 1 Aug 2014 22:57:14 +0000 (01:57 +0300)
13 files changed:
src/plugins/weather/forecast.c
src/plugins/weather/forecast.h
src/plugins/weather/httputil.c
src/plugins/weather/httputil.h
src/plugins/weather/location.c
src/plugins/weather/location.h
src/plugins/weather/logutil.c
src/plugins/weather/logutil.h
src/plugins/weather/weather.c
src/plugins/weather/weatherwidget.c
src/plugins/weather/weatherwidget.h
src/plugins/weather/yahooutil.c
src/plugins/weather/yahooutil.h

index 8dbf5cb..9990e41 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index 69dcacd..f6476f3 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index bb5bcf8..9591658 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index f3e387b..472bdd0 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index bb60a4e..b8e1cbb 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
@@ -180,9 +180,6 @@ copyLocation(gpointer * pDestination, gpointer pSource)
       pDest->pcState_ = g_strndup(pSrc->pcState_, 
                                           (pSrc->pcState_)?strlen(pSrc->pcState_):0);
 
-      pDest->pcState_ = g_strndup(pSrc->pcState_, 
-                                          (pSrc->pcState_)?strlen(pSrc->pcState_):0);
-
       pDest->pcCountry_ = g_strndup(pSrc->pcCountry_, 
                                           (pSrc->pcCountry_)?strlen(pSrc->pcCountry_):0);
 
index 644fe24..58f062d 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index fc94f0f..fe0c7a1 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
@@ -174,17 +174,18 @@ logUtil(LXWEATHER_LOGLEVEL level, const char * pczMsg, ...)
 
               if (level == LXW_ERROR)
                 {
-                  fprintf(stderr, cBuf);
+                  fprintf(stderr, "%s", cBuf);
                 }
               else
                 {
-                  fprintf(stdout, cBuf);
+                  fprintf(stdout, "%s", cBuf);
                 }
             }
           else
             {
               /* write to file */
-              write(g_FD, cBuf, szBuf);
+              size_t wsz = write(g_FD, cBuf, szBuf);
+              (void) wsz; /* to prevent compile warning */
             }
         }
            
index 88ab8cd..4c6cf14 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index c3d3ddd..7fcb052 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
@@ -42,16 +42,41 @@ typedef struct
   GtkWidget * pWeather_;
 } WeatherPluginPrivate;
 
+
+/**
+ * Weather Plugin destructor.
+ *
+ * @param pData Pointer to the plugin data (private).
+ */
+static void
+weather_destructor(gpointer pData)
+{
+  WeatherPluginPrivate * pPriv = (WeatherPluginPrivate *) pData;
+
+  LXW_LOG(LXW_DEBUG, "weather_destructor(%d): %d", pPriv->iMyId_, g_iCount);
+
+  g_free(pPriv);
+
+  --g_iCount;
+
+  if (g_iCount == 0)
+    {
+      cleanupYahooUtil();
+
+      cleanupLogUtil();
+    }
+}
+
 /**
  * Weather Plugin constructor
  *
  * @param pPlugin Pointer to the PluginClass wrapper instance.
- * @param pcFP Pointer to the configuration file position for this plugin.
+ * @param setting Pointer to the configuration settings for this plugin.
  *
- * @return 1 (TRUE) on success, 0 (FALSE) on failure.
+ * @return Pointer to a new weather widget.
  */
-static int
-weather_constructor(Plugin * pPlugin, char ** pFP)
+static GtkWidget *
+weather_constructor(Panel *pPanel, config_setting_t *pConfig)
 {
   WeatherPluginPrivate * pPriv = g_new0(WeatherPluginPrivate, 1);
 
@@ -77,79 +102,98 @@ weather_constructor(Plugin * pPlugin, char ** pFP)
 
   GtkWidget * pEventBox = gtk_event_box_new();
 
-  /* Connect signals. */
+  /* Connect signals. 
   g_signal_connect(pEventBox, 
                    "button-press-event", 
                    G_CALLBACK(plugin_button_press_event),
-                   pPlugin);
+                   pPlugin);*/
 
+  lxpanel_plugin_set_data(pEventBox, pPriv, weather_destructor);
   gtk_container_add(GTK_CONTAINER(pEventBox), pWidg);
 
-  pPlugin->priv = pPriv;
-  pPlugin->pwid = pEventBox;
-
-  gtk_widget_set_has_window(pPlugin->pwid,FALSE);
+  gtk_widget_set_has_window(pEventBox, FALSE);
 
-  gtk_widget_show_all(pPlugin->pwid);
+  gtk_widget_show_all(pEventBox);
 
-  /* use config, see lxpanel_get_line, below */
+  /* use config settings */
   LocationInfo * pLocation = g_new0(LocationInfo, 1);
+  const char *pczDummy = NULL;
 
-  line l;
+  if (config_setting_lookup_string(pConfig, "alias", &pczDummy))
+    {
+      pLocation->pcAlias_ = g_strndup(pczDummy, (pczDummy) ? strlen(pczDummy) : 0);
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup alias in config.");
+    }
 
-  l.len = 256;
-  
-  if (pFP)
+  if (config_setting_lookup_string(pConfig, "city", &pczDummy))
+    {
+      pLocation->pcCity_ = g_strndup(pczDummy, (pczDummy) ? strlen(pczDummy) : 0);
+    }
+  else
     {
-      while (lxpanel_get_line(pFP, &l) != LINE_BLOCK_END)
-        {
-          if (l.type == LINE_VAR)
-            {
-              if (!g_ascii_strcasecmp(l.t[0], "alias"))
-                {
-                  pLocation->pcAlias_ = g_strndup(l.t[1], strlen(l.t[1]));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "city"))
-                {
-                  pLocation->pcCity_ = g_strndup(l.t[1], strlen(l.t[1]));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "state"))
-                {
-                  pLocation->pcState_ = g_strndup(l.t[1], strlen(l.t[1]));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "country"))
-                {
-                  pLocation->pcCountry_ = g_strndup(l.t[1], strlen(l.t[1]));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "woeid"))
-                {
-                  pLocation->pcWOEID_ = g_strndup(l.t[1], strlen(l.t[1]));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "units"))
-                {
-                  pLocation->cUnits_ = *(l.t[1]);
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "interval"))
-                {
-                  pLocation->uiInterval_ = (guint)abs((gint)g_ascii_strtoll((l.t[1])?l.t[1]:"1", NULL, 10));
-                }
-              else if (!g_ascii_strcasecmp(l.t[0], "enabled"))
-                {
-                  pLocation->bEnabled_ = (gint)g_ascii_strtoll((l.t[1])?l.t[1]:"0", NULL, 10);
-                }
-
-            }
-          else
-            {
-              LXW_LOG(LXW_ERROR, "Weather: illegal config line: %s", l.str);
-
-              return 0;
-            }
-
-        }
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup city in config.");
+    }
 
+  if (config_setting_lookup_string(pConfig, "state", &pczDummy))
+    {
+      pLocation->pcState_ = g_strndup(pczDummy, (pczDummy) ? strlen(pczDummy) : 0);
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup state in config.");
+    }
+
+  if (config_setting_lookup_string(pConfig, "country", &pczDummy))
+    {
+      pLocation->pcCountry_ = g_strndup(pczDummy, (pczDummy) ? strlen(pczDummy) : 0);
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup country in config.");
+    }
+    
+  if (config_setting_lookup_string(pConfig, "woeid", &pczDummy))
+    {
+      pLocation->pcWOEID_ = g_strndup(pczDummy, (pczDummy) ? strlen(pczDummy) : 0);
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup woeid in config.");
+    }
+
+  if (config_setting_lookup_string(pConfig, "units", &pczDummy))
+    {
+      pLocation->cUnits_ = pczDummy[0];
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup units in config.");
+    }
+
+  int iDummyVal = 0;
+  if (config_setting_lookup_int(pConfig, "interval", &iDummyVal))
+    {
+      pLocation->uiInterval_ = (guint)iDummyVal;
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup interval in config.");
     }
   
+  iDummyVal = 0;
+  if (config_setting_lookup_int(pConfig, "enabled", &iDummyVal))
+    {
+      pLocation->bEnabled_ = (gint)iDummyVal;
+    }
+  else
+    {
+      LXW_LOG(LXW_ERROR, "Weather: could not lookup enabled flag in config.");
+    }
+
+  
   if (pLocation->pcAlias_ && pLocation->pcWOEID_)
     {
       GValue locationValue = G_VALUE_INIT;
@@ -166,52 +210,27 @@ weather_constructor(Plugin * pPlugin, char ** pFP)
 
   freeLocation(pLocation);
 
-  return 1;
-}
-
-/**
- * Weather Plugin destructor.
- *
- * @param pPlugin Pointer to the PluginClass wrapper instance.
- */
-static void
-weather_destructor(Plugin * pPlugin)
-{
-  WeatherPluginPrivate * pPriv = (WeatherPluginPrivate *) pPlugin->priv;
-
-  LXW_LOG(LXW_DEBUG, "weather_destructor(%d): %d", pPriv->iMyId_, g_iCount);
-
-  g_free(pPriv);
-
-  --g_iCount;
-
-  if (g_iCount == 0)
-    {
-      cleanupYahooUtil();
-
-      cleanupLogUtil();
-    }
+  return pEventBox;
 }
 
 /**
  * Weather Plugin configuration change callback.
  *
+ * @param pPanel  Pointer to the panel instance.
  * @param pPlugin Pointer to the PluginClass wrapper instance.
  */
 static void
-weather_configuration_changed(Plugin * pPlugin)
+weather_configuration_changed(Panel *pPanel, GtkWidget *pWidget)
 {
   LXW_LOG(LXW_DEBUG, "weather_configuration_changed()");
 
-  if (pPlugin && pPlugin->panel)
+  if (pPanel && pWidget)
     {
       LXW_LOG(LXW_DEBUG, 
              "   orientation: %s, width: %d, height: %d, icon size: %d\n", 
-             (pPlugin->panel->orientation == ORIENT_HORIZ)?"HORIZONTAL":
-             (pPlugin->panel->orientation == ORIENT_VERT)?"VERTICAL":"NONE",
-             pPlugin->panel->width,
-             pPlugin->panel->height,
-             pPlugin->panel->icon_size);
+             (pPanel->orientation == ORIENT_HORIZ)?"HORIZONTAL":
+             (pPanel->orientation == ORIENT_VERT)?"VERTICAL":"NONE",
+             pPanel->width, pPanel->height, pPanel->icon_size);
     }
 
 }
@@ -219,17 +238,22 @@ weather_configuration_changed(Plugin * pPlugin)
 /**
  * Weather Plugin configuration dialog callback.
  *
- * @param pPlugin Pointer to the PluginClass wrapper instance.
+ * @param pPanel  Pointer to the panel instance.
+ * @param pWidget Pointer to the Plugin widget instance.
  * @param pParent Pointer to the GtkWindow parent.
+ *
+ * @return Instance of the widget.
  */
-static void
-weather_configure(Plugin * pPlugin, GtkWindow * pParent G_GNUC_UNUSED)
+static GtkWidget *
+weather_configure(Panel *pPanel G_GNUC_UNUSED, GtkWidget *pWidget, GtkWindow * pParent G_GNUC_UNUSED)
 {
   LXW_LOG(LXW_DEBUG, "weather_configure()");
 
-  WeatherPluginPrivate * pPriv = (WeatherPluginPrivate *) pPlugin->priv;
+  WeatherPluginPrivate * pPriv = (WeatherPluginPrivate *) lxpanel_plugin_get_data(pWidget);
 
   gtk_weather_run_preferences_dialog(GTK_WIDGET(pPriv->pWeather_));
+
+  return pWidget;
 }
 
 /**
@@ -270,20 +294,14 @@ weather_save_configuration(Plugin * pPlugin, FILE *pFile)
 
 }
 
+FM_DEFINE_MODULE(lxpanel_gtk, weather)
+
 /**
- * Definition of the weather plugin class
- *
- *
+ * Definition of the weather plugin module
  */
-PluginClass weather_plugin_class =
+LXPanelPluginInit fm_module_init_lxpanel_gtk =
   {
-    // version info
-    PLUGINCLASS_VERSIONING,
-
-    // general info
-    .type = "weather",
     .name = N_("Weather Plugin"),
-    .version = "0.0.1",
     .description = N_("Show weather conditions for a location."),
 
     // system settings
@@ -291,9 +309,7 @@ PluginClass weather_plugin_class =
     .expand_available = 0,
 
     // API functions
-    .constructor = weather_constructor,
-    .destructor = weather_destructor,
+    .new_instance = weather_constructor,
     .config = weather_configure,
-    .save = weather_save_configuration,
-    .panel_configuration_changed = weather_configuration_changed
+    .reconfigure = weather_configuration_changed
   };
index c06a0a7..2332bc6 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
@@ -369,6 +369,7 @@ gtk_weather_destroy(GObject * object)
     }
   
   /* Need to free location and forecast. */
+  freeLocation(priv->previous_location);
   freeLocation(priv->location);
   freeForecast(priv->forecast);
 
@@ -1024,7 +1025,7 @@ gtk_weather_run_error_dialog(GtkWindow * parent, gchar * error_msg)
                                                         GTK_DIALOG_MODAL,
                                                         GTK_MESSAGE_ERROR,
                                                         GTK_BUTTONS_OK,
-                                                        error_msg);
+                                                        "%s", error_msg);
       
       gtk_weather_set_window_icon(GTK_WINDOW(error_dialog), "gtk-dialog-error");
       
index b6c66dd..75d9620 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-201 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
index 147ce8e..a5aa0be 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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
@@ -145,8 +145,6 @@ getForecastQuery(gchar * pcQuery, const gchar * pczWOEID, const gchar czUnits)
 static gchar *
 convertToASCII(const gchar *pczInString)
 {
-  char * pcCurrLocale = setlocale(LC_CTYPE, NULL);
-
   // for UTF-8 to ASCII conversions
   setlocale(LC_CTYPE, "en_US");
 
@@ -188,8 +186,8 @@ convertToASCII(const gchar *pczInString)
       xmlFree(pxEscapedString);
     }
 
-  // restore locale
-  setlocale(LC_CTYPE, pcCurrLocale);
+  // restore locale to default
+  setlocale(LC_CTYPE, "");
 
   return pcConvertedString;
 }
@@ -238,6 +236,8 @@ setImageIfDifferent(gchar ** pcStorage,
                     const gchar * pczNewURL,
                     const gsize szURLLength)
 {
+  int err = 0;
+
   // if diffrent, clear and set
   if (g_strcmp0(*pcStorage, pczNewURL))
     {
@@ -282,8 +282,8 @@ setImageIfDifferent(gchar ** pcStorage,
                   pError->message);
 
           g_error_free(pError);
-
-          return -1;
+          
+          err = -1;
         }
 
       if (!g_input_stream_close(pInputStream, NULL, &pError))
@@ -293,12 +293,12 @@ setImageIfDifferent(gchar ** pcStorage,
 
           g_error_free(pError);
 
-          return -1;
+          err = -1;
         }
-
+      
     }
 
-  return 0;
+  return err;
 }
 
 /**
index 651ac8f..8216a5d 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012-2013 Piotr Sipika; see the AUTHORS file for more.
+ * Copyright (c) 2012-2014 Piotr Sipika; see the AUTHORS file for more.
  *
  * 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