summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2009-02-26 12:15:20 +0000
committerRichard Hughes <richard@hughsie.com>2009-02-26 12:15:20 +0000
commit55db60ef820c1cb0fafc54f8d530a5f448e5e48f (patch)
treeb0e90e7dad9fbca46c03357b079ebdecf353df65
parent39ba30a4b4ad5ca753239120f653c7a6a6365174 (diff)
downloadupower-55db60ef820c1cb0fafc54f8d530a5f448e5e48f.tar.gz
bugfix: remove use of EggObjList, which was pretty hacky, and try to make the library more sane
-rw-r--r--libdevkit-power/Makefile.am5
-rw-r--r--libdevkit-power/dkp-client.h8
-rw-r--r--libdevkit-power/dkp-device.c42
-rw-r--r--libdevkit-power/dkp-device.h13
-rw-r--r--libdevkit-power/dkp-enum.h4
-rw-r--r--libdevkit-power/dkp-history-obj.h6
-rw-r--r--libdevkit-power/dkp-object.h6
-rw-r--r--libdevkit-power/dkp-qos-obj.h6
-rw-r--r--libdevkit-power/dkp-stats-obj.h6
-rw-r--r--libdevkit-power/dkp-wakeups-obj.h6
-rw-r--r--libdevkit-power/dkp-wakeups.h10
-rw-r--r--libdevkit-power/egg-obj-list.c668
-rw-r--r--libdevkit-power/egg-obj-list.h97
-rw-r--r--src/Makefile.am1
-rw-r--r--src/dkp-device.c20
-rw-r--r--src/dkp-history.c276
-rw-r--r--src/dkp-history.h4
-rw-r--r--tools/Makefile.am1
18 files changed, 262 insertions, 917 deletions
diff --git a/libdevkit-power/Makefile.am b/libdevkit-power/Makefile.am
index 433f6e5..cc7370f 100644
--- a/libdevkit-power/Makefile.am
+++ b/libdevkit-power/Makefile.am
@@ -1,7 +1,9 @@
INCLUDES = \
$(GLIB_CFLAGS) \
$(DBUS_GLIB_CFLAGS) \
+ -I$(top_srcdir) \
-I$(top_srcdir)/libdevkit-power \
+ -DDKP_COMPILATION \
-DEGG_LOG_FILE=\""$(DKP_LOG_DIR)/DeviceKit-power"\" \
-DEGG_VERBOSE="\"DKP_VERBOSE\"" \
-DEGG_LOGGING="\"DKP_LOGGING\"" \
@@ -17,8 +19,7 @@ libdevkit_power_la_SOURCES = \
egg-debug.h \
egg-string.c \
egg-string.h \
- egg-obj-list.c \
- egg-obj-list.h \
+ devicekit-power.h \
dkp-client.c \
dkp-client.h \
dkp-device.c \
diff --git a/libdevkit-power/dkp-client.h b/libdevkit-power/dkp-client.h
index 785f240..4c62b1e 100644
--- a/libdevkit-power/dkp-client.h
+++ b/libdevkit-power/dkp-client.h
@@ -19,12 +19,16 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_CLIENT_H
#define __DKP_CLIENT_H
#include <glib-object.h>
-#include <dkp-enum.h>
-#include "dkp-device.h"
+#include <libdevkit-power/dkp-enum.h>
+#include <libdevkit-power/dkp-device.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-device.c b/libdevkit-power/dkp-device.c
index 46f5d59..21656e0 100644
--- a/libdevkit-power/dkp-device.c
+++ b/libdevkit-power/dkp-device.c
@@ -27,7 +27,6 @@
#include <dbus/dbus-glib.h>
#include "egg-debug.h"
-#include "egg-obj-list.h"
#include "dkp-device.h"
#include "dkp-object.h"
@@ -201,8 +200,8 @@ static gboolean
dkp_device_print_history (const DkpDevice *device, const gchar *type)
{
guint i;
- EggObjList *array;
- DkpHistoryObj *obj;
+ GPtrArray *array;
+ const DkpHistoryObj *obj;
gboolean ret = FALSE;
/* get a fair chunk of data */
@@ -213,10 +212,11 @@ dkp_device_print_history (const DkpDevice *device, const gchar *type)
/* pretty print */
g_print (" History (%s):\n", type);
for (i=0; i<array->len; i++) {
- obj = (DkpHistoryObj *) egg_obj_list_index (array, i);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, i);
g_print (" %i\t%.3f\t%s\n", obj->time, obj->value, dkp_device_state_to_text (obj->state));
}
- g_object_unref (array);
+ g_ptr_array_foreach (array, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (array, TRUE);
ret = TRUE;
out:
return ret;
@@ -269,7 +269,7 @@ out:
*
* Returns an array of %DkpHistoryObj's
**/
-EggObjList *
+GPtrArray *
dkp_device_get_history (const DkpDevice *device, const gchar *type, guint timespec, guint resolution)
{
GError *error = NULL;
@@ -279,11 +279,11 @@ dkp_device_get_history (const DkpDevice *device, const gchar *type, guint timesp
GValue *gv;
guint i;
DkpHistoryObj *obj;
- EggObjList *array = NULL;
+ GPtrArray *array = NULL;
gboolean ret;
- g_return_val_if_fail (DKP_IS_DEVICE (device), FALSE);
- g_return_val_if_fail (device->priv->proxy_device != NULL, FALSE);
+ g_return_val_if_fail (DKP_IS_DEVICE (device), NULL);
+ g_return_val_if_fail (device->priv->proxy_device != NULL, NULL);
g_type_gvalue_array = dbus_g_type_get_collection ("GPtrArray",
dbus_g_type_get_struct("GValueArray",
@@ -312,9 +312,7 @@ dkp_device_get_history (const DkpDevice *device, const gchar *type, guint timesp
goto out;
/* convert */
- array = egg_obj_list_new ();
- egg_obj_list_set_copy (array, (EggObjListCopyFunc) dkp_history_obj_copy);
- egg_obj_list_set_free (array, (EggObjListFreeFunc) dkp_history_obj_free);
+ array = g_ptr_array_new ();
for (i=0; i<gvalue_ptr_array->len; i++) {
gva = (GValueArray *) g_ptr_array_index (gvalue_ptr_array, i);
@@ -331,8 +329,7 @@ dkp_device_get_history (const DkpDevice *device, const gchar *type, guint timesp
gv = g_value_array_get_nth (gva, 2);
obj->state = dkp_device_state_from_text (g_value_get_string (gv));
g_value_unset (gv);
- egg_obj_list_add (array, obj);
- dkp_history_obj_free (obj);
+ g_ptr_array_add (array, obj);
g_value_array_free (gva);
}
@@ -347,7 +344,7 @@ out:
*
* Returns an array of %DkpStatsObj's
**/
-EggObjList *
+GPtrArray *
dkp_device_get_statistics (const DkpDevice *device, const gchar *type)
{
GError *error = NULL;
@@ -357,11 +354,11 @@ dkp_device_get_statistics (const DkpDevice *device, const gchar *type)
GValue *gv;
guint i;
DkpStatsObj *obj;
- EggObjList *array = NULL;
+ GPtrArray *array = NULL;
gboolean ret;
- g_return_val_if_fail (DKP_IS_DEVICE (device), FALSE);
- g_return_val_if_fail (device->priv->proxy_device != NULL, FALSE);
+ g_return_val_if_fail (DKP_IS_DEVICE (device), NULL);
+ g_return_val_if_fail (device->priv->proxy_device != NULL, NULL);
g_type_gvalue_array = dbus_g_type_get_collection ("GPtrArray",
dbus_g_type_get_struct("GValueArray",
@@ -387,11 +384,7 @@ dkp_device_get_statistics (const DkpDevice *device, const gchar *type)
goto out;
/* convert */
- array = egg_obj_list_new ();
- egg_obj_list_set_copy (array, (EggObjListCopyFunc) dkp_stats_obj_copy);
- egg_obj_list_set_free (array, (EggObjListFreeFunc) dkp_stats_obj_free);
- egg_obj_list_set_to_string (array, (EggObjListToStringFunc) dkp_stats_obj_to_string);
- egg_obj_list_set_from_string (array, (EggObjListFromStringFunc) dkp_stats_obj_from_string);
+ array = g_ptr_array_new ();
for (i=0; i<gvalue_ptr_array->len; i++) {
gva = (GValueArray *) g_ptr_array_index (gvalue_ptr_array, i);
@@ -405,8 +398,7 @@ dkp_device_get_statistics (const DkpDevice *device, const gchar *type)
obj->accuracy = g_value_get_double (gv);
g_value_unset (gv);
/* 2 */
- egg_obj_list_add (array, obj);
- dkp_stats_obj_free (obj);
+ g_ptr_array_add (array, obj);
g_value_array_free (gva);
}
out:
diff --git a/libdevkit-power/dkp-device.h b/libdevkit-power/dkp-device.h
index 3171d91..a6c444e 100644
--- a/libdevkit-power/dkp-device.h
+++ b/libdevkit-power/dkp-device.h
@@ -19,13 +19,16 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_DEVICE_H
#define __DKP_DEVICE_H
#include <glib-object.h>
-#include <dkp-enum.h>
-#include <dkp-object.h>
-#include "egg-obj-list.h"
+#include <libdevkit-power/dkp-enum.h>
+#include <libdevkit-power/dkp-object.h>
G_BEGIN_DECLS
@@ -63,11 +66,11 @@ gboolean dkp_device_set_object_path (DkpDevice *device,
gboolean dkp_device_print (const DkpDevice *device);
gboolean dkp_device_refresh (DkpDevice *device);
-EggObjList *dkp_device_get_history (const DkpDevice *device,
+GPtrArray *dkp_device_get_history (const DkpDevice *device,
const gchar *type,
guint timespec,
guint resolution);
-EggObjList *dkp_device_get_statistics (const DkpDevice *device,
+GPtrArray *dkp_device_get_statistics (const DkpDevice *device,
const gchar *type);
G_END_DECLS
diff --git a/libdevkit-power/dkp-enum.h b/libdevkit-power/dkp-enum.h
index dc198fa..166b3b1 100644
--- a/libdevkit-power/dkp-enum.h
+++ b/libdevkit-power/dkp-enum.h
@@ -19,6 +19,10 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_ENUM_H__
#define __DKP_ENUM_H__
diff --git a/libdevkit-power/dkp-history-obj.h b/libdevkit-power/dkp-history-obj.h
index d98abbb..a676889 100644
--- a/libdevkit-power/dkp-history-obj.h
+++ b/libdevkit-power/dkp-history-obj.h
@@ -18,11 +18,15 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_HISTORY_OBJ_H__
#define __DKP_HISTORY_OBJ_H__
#include <glib.h>
-#include "dkp-enum.h"
+#include <libdevkit-power/dkp-enum.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-object.h b/libdevkit-power/dkp-object.h
index c836360..55946c9 100644
--- a/libdevkit-power/dkp-object.h
+++ b/libdevkit-power/dkp-object.h
@@ -18,11 +18,15 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_OBJECT_H__
#define __DKP_OBJECT_H__
#include <glib.h>
-#include "dkp-enum.h"
+#include <libdevkit-power/dkp-enum.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-qos-obj.h b/libdevkit-power/dkp-qos-obj.h
index 63b5fb8..4e2b36c 100644
--- a/libdevkit-power/dkp-qos-obj.h
+++ b/libdevkit-power/dkp-qos-obj.h
@@ -18,11 +18,15 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_QOS_OBJ_H__
#define __DKP_QOS_OBJ_H__
#include <glib.h>
-#include "dkp-enum.h"
+#include <libdevkit-power/dkp-enum.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-stats-obj.h b/libdevkit-power/dkp-stats-obj.h
index f29c09a..8daa68a 100644
--- a/libdevkit-power/dkp-stats-obj.h
+++ b/libdevkit-power/dkp-stats-obj.h
@@ -18,11 +18,15 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_STATS_OBJ_H__
#define __DKP_STATS_OBJ_H__
#include <glib.h>
-#include "dkp-enum.h"
+#include <libdevkit-power/dkp-enum.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-wakeups-obj.h b/libdevkit-power/dkp-wakeups-obj.h
index 7939cfd..52d48dc 100644
--- a/libdevkit-power/dkp-wakeups-obj.h
+++ b/libdevkit-power/dkp-wakeups-obj.h
@@ -18,11 +18,15 @@
*
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_WAKEUPS_OBJ_H__
#define __DKP_WAKEUPS_OBJ_H__
#include <glib.h>
-#include "dkp-enum.h"
+#include <libdevkit-power/dkp-enum.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/dkp-wakeups.h b/libdevkit-power/dkp-wakeups.h
index 770e5bc..890920f 100644
--- a/libdevkit-power/dkp-wakeups.h
+++ b/libdevkit-power/dkp-wakeups.h
@@ -19,13 +19,17 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#if !defined (__DEVICEKIT_POWER_H_INSIDE__) && !defined (DKP_COMPILATION)
+#error "Only <devicekit-power.h> can be included directly."
+#endif
+
#ifndef __DKP_WAKEUPS_H
#define __DKP_WAKEUPS_H
#include <glib-object.h>
-#include <dkp-enum.h>
-#include "dkp-device.h"
-#include "dkp-wakeups-obj.h"
+#include <libdevkit-power/dkp-enum.h>
+#include <libdevkit-power/dkp-device.h>
+#include <libdevkit-power/dkp-wakeups-obj.h>
G_BEGIN_DECLS
diff --git a/libdevkit-power/egg-obj-list.c b/libdevkit-power/egg-obj-list.c
deleted file mode 100644
index 6e3fd25..0000000
--- a/libdevkit-power/egg-obj-list.c
+++ /dev/null
@@ -1,668 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib/gi18n.h>
-#include <glib.h>
-
-#include "egg-debug.h"
-#include "egg-obj-list.h"
-
-#define EGG_OBJ_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), EGG_TYPE_OBJ_LIST, EggObjListPrivate))
-
-struct EggObjListPrivate
-{
- EggObjListNewFunc func_new;
- EggObjListCopyFunc func_copy;
- EggObjListFreeFunc func_free;
- EggObjListCompareFunc func_compare;
- EggObjListToStringFunc func_to_string;
- EggObjListFromStringFunc func_from_string;
- GPtrArray *array;
-};
-
-G_DEFINE_TYPE (EggObjList, egg_obj_list, G_TYPE_OBJECT)
-
-/**
- * egg_obj_list_set_new:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a creation func
- **/
-void
-egg_obj_list_set_new (EggObjList *list, EggObjListNewFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_new = func;
-}
-
-/**
- * egg_obj_list_set_copy:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a copy func
- **/
-void
-egg_obj_list_set_copy (EggObjList *list, EggObjListCopyFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_copy = func;
-}
-
-/**
- * egg_obj_list_set_free:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a free func
- **/
-void
-egg_obj_list_set_free (EggObjList *list, EggObjListFreeFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_free = func;
-}
-
-/**
- * egg_obj_list_set_compare:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a compare func
- **/
-void
-egg_obj_list_set_compare (EggObjList *list, EggObjListCompareFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_compare = func;
-}
-
-/**
- * egg_obj_list_set_to_string:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a to string func
- **/
-void
-egg_obj_list_set_to_string (EggObjList *list, EggObjListToStringFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_to_string = func;
-}
-
-/**
- * egg_obj_list_set_from_string:
- * @list: a valid #EggObjList instance
- * @func: typedef'd function
- *
- * Adds a from string func
- **/
-void
-egg_obj_list_set_from_string (EggObjList *list, EggObjListFromStringFunc func)
-{
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- list->priv->func_from_string = func;
-}
-
-/**
- * egg_obj_list_clear:
- * @list: a valid #EggObjList instance
- *
- * Clears the package list
- **/
-void
-egg_obj_list_clear (EggObjList *list)
-{
- GPtrArray *array;
- EggObjListFreeFunc func_free;
-
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
-
- array = list->priv->array;
- func_free = list->priv->func_free;
- if (func_free != NULL)
- g_ptr_array_foreach (array, (GFunc) func_free, NULL);
- g_ptr_array_remove_range (array, 0, array->len);
-
- list->len = 0;
-}
-
-/**
- * egg_obj_list_print:
- * @list: a valid #EggObjList instance
- *
- * Prints the package list
- **/
-void
-egg_obj_list_print (EggObjList *list)
-{
- guint i;
- gpointer obj;
- GPtrArray *array;
- gchar *text;
- EggObjListToStringFunc func_to_string;
-
- g_return_if_fail (list->priv->func_to_string != NULL);
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
-
- array = list->priv->array;
- func_to_string = list->priv->func_to_string;
- for (i=0; i<array->len; i++) {
- obj = g_ptr_array_index (array, i);
- text = func_to_string (obj);
- g_print ("(%i)\t%s\n", i, text);
- g_free (text);
- }
-}
-
-/**
- * egg_obj_list_to_string:
- * @list: a valid #EggObjList instance
- *
- * Converts the list to a newline delimited string
- **/
-gchar *
-egg_obj_list_to_string (EggObjList *list)
-{
- guint i;
- gpointer obj;
- GPtrArray *array;
- gchar *text;
- EggObjListToStringFunc func_to_string;
- GString *string;
-
- g_return_val_if_fail (list->priv->func_to_string != NULL, NULL);
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), NULL);
-
- array = list->priv->array;
- func_to_string = list->priv->func_to_string;
- string = g_string_new ("");
- for (i=0; i<array->len; i++) {
- obj = g_ptr_array_index (array, i);
- text = func_to_string (obj);
- g_string_append_printf (string, "%s\n", text);
- g_free (text);
- }
- /* remove trailing newline */
- if (string->len != 0)
- g_string_set_size (string, string->len-1);
-
- return g_string_free (string, FALSE);
-}
-
-/**
- * egg_obj_list_add:
- * @list: a valid #EggObjList instance
- * @obj: a valid #gpointer object
- *
- * Adds a copy of the object to the list
- **/
-void
-egg_obj_list_add (EggObjList *list, gconstpointer obj)
-{
- gpointer obj_new;
-
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- g_return_if_fail (obj != NULL);
- g_return_if_fail (list->priv->func_copy != NULL);
-
- /* TODO: are we already in the list? */
- obj_new = list->priv->func_copy (obj);
- g_ptr_array_add (list->priv->array, obj_new);
- list->len = list->priv->array->len;
-}
-
-/**
- * egg_obj_list_add_list:
- *
- * Makes a deep copy of the list
- **/
-void
-egg_obj_list_add_list (EggObjList *list, const EggObjList *data)
-{
- guint i;
- gconstpointer obj;
-
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- g_return_if_fail (EGG_IS_OBJ_LIST (data));
-
- /* add data items to list */
- for (i=0; i < data->len; i++) {
- obj = egg_obj_list_index (data, i);
- egg_obj_list_add (list, obj);
- }
-}
-
-/**
- * egg_obj_list_remove_list:
- *
- * Makes a deep copy of the list
- **/
-void
-egg_obj_list_remove_list (EggObjList *list, const EggObjList *data)
-{
- guint i;
- gconstpointer obj;
-
- g_return_if_fail (EGG_IS_OBJ_LIST (list));
- g_return_if_fail (EGG_IS_OBJ_LIST (data));
-
- /* remove data items from list */
- for (i=0; i < data->len; i++) {
- obj = egg_obj_list_index (data, i);
- egg_obj_list_remove (list, obj);
- }
-}
-
-/**
- * egg_obj_list_find_obj:
- * @list: a valid #EggObjList instance
- * @obj: a valid #gpointer object
- *
- * Return value: the object
- *
- * Removes an item from a list
- **/
-static gboolean
-egg_obj_list_obj_equal (EggObjList *list, gconstpointer obj1, gconstpointer obj2)
-{
- EggObjListCompareFunc func_compare;
-
- /* two less pointer deferences... */
- func_compare = list->priv->func_compare;
-
- /* trivial case */
- if (func_compare == NULL)
- return obj1 == obj2;
-
- /* use helper function */
- return func_compare (obj1, obj2) == 0;
-}
-
-/**
- * egg_obj_list_remove_duplicate:
- *
- * Removes duplicate entries
- **/
-void
-egg_obj_list_remove_duplicate (EggObjList *list)
-{
- guint i, j;
- gconstpointer obj1;
- gconstpointer obj2;
-
- for (i=0; i<list->len; i++) {
- obj1 = egg_obj_list_index (list, i);
- for (j=0; j<list->len; j++) {
- if (i == j)
- break;
- obj2 = egg_obj_list_index (list, j);
- if (egg_obj_list_obj_equal (list, obj1, obj2))
- egg_obj_list_remove_index (list, i);
- }
- }
-}
-
-/**
- * egg_obj_list_find_obj:
- * @list: a valid #EggObjList instance
- * @obj: a valid #gpointer object
- *
- * Return value: the object
- *
- * Removes an item from a list
- **/
-static gpointer
-egg_obj_list_find_obj (EggObjList *list, gconstpointer obj)
-{
- guint i;
- gconstpointer obj_tmp;
- EggObjListCompareFunc func_compare;
-
- /* the pointers point to the same thing */
- func_compare = list->priv->func_compare;
- if (func_compare == NULL)
- return (gpointer) obj;
-
- /* remove data items from list */
- for (i=0; i < list->len; i++) {
- obj_tmp = egg_obj_list_index (list, i);
- if (func_compare (obj_tmp, obj) == 0)
- return (gpointer) obj_tmp;
- }
-
- /* nothing found */
- return NULL;
-}
-
-/**
- * egg_obj_list_remove:
- * @list: a valid #EggObjList instance
- * @obj: a valid #gpointer object
- *
- * Return value: TRUE is we removed something
- *
- * Removes all the items from a list matching obj
- **/
-gboolean
-egg_obj_list_remove (EggObjList *list, gconstpointer obj)
-{
- gboolean ret;
- gpointer obj_new;
- gboolean found = FALSE;
-
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), FALSE);
- g_return_val_if_fail (obj != NULL, FALSE);
- g_return_val_if_fail (list->priv->func_free != NULL, FALSE);
-
- do {
- /* get the object */
- obj_new = egg_obj_list_find_obj (list, obj);
- if (obj_new == NULL)
- break;
-
- /* try to remove */
- ret = g_ptr_array_remove (list->priv->array, obj_new);
-
- /* no compare function, and pointer not found */
- if (!ret)
- break;
-
- found = TRUE;
- list->priv->func_free (obj_new);
- list->len = list->priv->array->len;
- } while (ret);
-
- return found;
-}
-
-/**
- * egg_obj_list_remove_index:
- * @list: a valid #EggObjList instance
- * @index: the number to remove
- *
- * Return value: TRUE is we removed something
- *
- * Removes an item from a list
- **/
-gboolean
-egg_obj_list_remove_index (EggObjList *list, guint index)
-{
- gpointer obj;
-
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), FALSE);
- g_return_val_if_fail (list->priv->func_free != NULL, FALSE);
-
- /* get the object */
- obj = g_ptr_array_remove_index (list->priv->array, index);
- if (obj == NULL)
- return FALSE;
- list->priv->func_free (obj);
- list->len = list->priv->array->len;
- return TRUE;
-}
-
-/**
- * egg_obj_list_to_file:
- * @list: a valid #EggObjList instance
- * @filename: a filename
- *
- * Saves a copy of the list to a file
- **/
-gboolean
-egg_obj_list_to_file (EggObjList *list, const gchar *filename)
-{
- guint i;
- gconstpointer obj;
- gchar *part;
- GString *string;
- gboolean ret = TRUE;
- GError *error = NULL;
- EggObjListFreeFunc func_free;
- EggObjListToStringFunc func_to_string;
-
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), FALSE);
- g_return_val_if_fail (list->priv->func_to_string != NULL, FALSE);
- g_return_val_if_fail (list->priv->func_free != NULL, FALSE);
-
- func_free = list->priv->func_free;
- func_to_string = list->priv->func_to_string;
-
- /* generate data */
- string = g_string_new ("");
- for (i=0; i<list->len; i++) {
- obj = egg_obj_list_index (list, i);
- part = func_to_string (obj);
- if (part == NULL) {
- ret = FALSE;
- break;
- }
- g_string_append_printf (string, "%s\n", part);
- g_free (part);
- }
- part = g_string_free (string, FALSE);
-
- /* we failed to convert to string */
- if (!ret) {
- egg_warning ("failed to convert");
- goto out;
- }
-
- /* save to disk */
- ret = g_file_set_contents (filename, part, -1, &error);
- if (!ret) {
- egg_warning ("failed to set data: %s", error->message);
- g_error_free (error);
- goto out;
- }
- egg_debug ("saved %s", filename);
-
-out:
- g_free (part);
- return ret;
-}
-
-/**
- * egg_obj_list_from_file:
- * @list: a valid #EggObjList instance
- * @filename: a filename
- *
- * Appends the list from a file
- **/
-gboolean
-egg_obj_list_from_file (EggObjList *list, const gchar *filename)
-{
- gboolean ret;
- GError *error = NULL;
- gchar *data = NULL;
- gchar **parts = NULL;
- guint i;
- guint length;
- gpointer obj;
- EggObjListFreeFunc func_free;
- EggObjListFromStringFunc func_from_string;
-
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), FALSE);
- g_return_val_if_fail (list->priv->func_from_string != NULL, FALSE);
- g_return_val_if_fail (list->priv->func_free != NULL, FALSE);
-
- func_free = list->priv->func_free;
- func_from_string = list->priv->func_from_string;
-
- /* do we exist */
- ret = g_file_test (filename, G_FILE_TEST_EXISTS);
- if (!ret) {
- egg_debug ("failed to get data from %s as file does not exist", filename);
- goto out;
- }
-
- /* get contents */
- ret = g_file_get_contents (filename, &data, NULL, &error);
- if (!ret) {
- egg_warning ("failed to get data: %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- /* split by line ending */
- parts = g_strsplit (data, "\n", 0);
- length = g_strv_length (parts);
- if (length == 0) {
- egg_debug ("no data in %s", filename);
- goto out;
- }
-
- /* add valid entries */
- egg_debug ("loading %i items of data from %s", length, filename);
- for (i=0; i<length-1; i++) {
- obj = func_from_string (parts[i]);
- if (obj != NULL)
- egg_obj_list_add (list, obj);
- func_free (obj);
- }
-
-out:
- g_strfreev (parts);
- g_free (data);
-
- return ret;
-}
-
-/**
- * egg_obj_list_index:
- * @list: a valid #EggObjList instance
- * @index: the element to return
- *
- * Gets an object from the list
- **/
-gconstpointer
-egg_obj_list_index (const EggObjList *list, guint index)
-{
- gconstpointer obj;
-
- g_return_val_if_fail (EGG_IS_OBJ_LIST (list), NULL);
-
- obj = g_ptr_array_index (list->priv->array, index);
- return obj;
-}
-
-/**
- * egg_obj_list_finalize:
- * @object: a valid #EggObjList instance
- **/
-static void
-egg_obj_list_finalize (GObject *object)
-{
- EggObjListFreeFunc func_free;
- gpointer obj;
- guint i;
- EggObjList *list;
- GPtrArray *array;
- g_return_if_fail (EGG_IS_OBJ_LIST (object));
- list = EGG_OBJ_LIST (object);
-
- array = list->priv->array;
- func_free = list->priv->func_free;
- for (i=0; i<array->len; i++) {
- obj = g_ptr_array_index (array, i);
- if (func_free != NULL)
- func_free (obj);
- }
- g_ptr_array_free (array, TRUE);
-
- G_OBJECT_CLASS (egg_obj_list_parent_class)->finalize (object);
-}
-
-/**
- * egg_obj_list_class_init:
- * @klass: a valid #EggObjListClass instance
- **/
-static void
-egg_obj_list_class_init (EggObjListClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = egg_obj_list_finalize;
- g_type_class_add_private (klass, sizeof (EggObjListPrivate));
-}
-
-/**
- * egg_obj_list_init:
- * @list: a valid #EggObjList instance
- *
- * Initializes the obj_list class.
- **/
-static void
-egg_obj_list_init (EggObjList *list)
-{
- list->priv = EGG_OBJ_LIST_GET_PRIVATE (list);
- list->priv->func_new = NULL;
- list->priv->func_copy = NULL;
- list->priv->func_free = NULL;
- list->priv->func_compare = NULL;
- list->priv->func_to_string = NULL;
- list->priv->func_from_string = NULL;
- list->priv->array = g_ptr_array_new ();
- list->len = list->priv->array->len;
-}
-
-/**
- * egg_obj_list_new:
- *
- * Return value: A new list class instance.
- **/
-EggObjList *
-egg_obj_list_new (void)
-{
- EggObjList *list;
- list = g_object_new (EGG_TYPE_OBJ_LIST, NULL);
- return EGG_OBJ_LIST (list);
-}
-
-/***************************************************************************
- *** MAKE CHECK TESTS ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-egg_obj_list_test (EggTest *test)
-{
- EggObjList *list;
-
- if (!egg_test_start (test, "EggObjList"))
- return;
-
- /************************************************************/
- egg_test_title (test, "get an instance");
- list = egg_obj_list_new ();
- egg_test_assert (test, list != NULL);
-
- g_object_unref (list);
-
- egg_test_end (test);
-}
-#endif
diff --git a/libdevkit-power/egg-obj-list.h b/libdevkit-power/egg-obj-list.h
deleted file mode 100644
index ced0e79..0000000
--- a/libdevkit-power/egg-obj-list.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __EGG_OBJ_LIST_H
-#define __EGG_OBJ_LIST_H
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define EGG_TYPE_OBJ_LIST (egg_obj_list_get_type ())
-#define EGG_OBJ_LIST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EGG_TYPE_OBJ_LIST, EggObjList))
-#define EGG_OBJ_LIST_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EGG_TYPE_OBJ_LIST, EggObjListClass))
-#define EGG_IS_OBJ_LIST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EGG_TYPE_OBJ_LIST))
-#define EGG_IS_OBJ_LIST_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EGG_TYPE_OBJ_LIST))
-#define EGG_OBJ_LIST_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EGG_TYPE_OBJ_LIST, EggObjListClass))
-
-typedef struct EggObjListPrivate EggObjListPrivate;
-
-typedef struct
-{
- GObject parent;
- EggObjListPrivate *priv;
- guint len;
-} EggObjList;
-
-typedef struct
-{
- GObjectClass parent_class;
-} EggObjListClass;
-
-typedef gpointer (*EggObjListNewFunc) (void);
-typedef gpointer (*EggObjListCopyFunc) (gconstpointer data);
-typedef void (*EggObjListFreeFunc) (gpointer data);
-typedef gint (*EggObjListCompareFunc) (gconstpointer data1,
- gconstpointer data2);
-typedef gpointer (*EggObjListFromStringFunc) (const gchar *data);
-typedef gchar *(*EggObjListToStringFunc) (gconstpointer data);
-
-GType egg_obj_list_get_type (void);
-EggObjList *egg_obj_list_new (void);
-
-void egg_obj_list_set_new (EggObjList *list,
- EggObjListNewFunc func);
-void egg_obj_list_set_copy (EggObjList *list,
- EggObjListCopyFunc func);
-void egg_obj_list_set_free (EggObjList *list,
- EggObjListFreeFunc func);
-void egg_obj_list_set_compare (EggObjList *list,
- EggObjListCompareFunc func);
-void egg_obj_list_set_to_string (EggObjList *list,
- EggObjListToStringFunc func);
-void egg_obj_list_set_from_string (EggObjList *list,
- EggObjListFromStringFunc func);
-void egg_obj_list_clear (EggObjList *list);
-void egg_obj_list_print (EggObjList *list);
-gchar *egg_obj_list_to_string (EggObjList *list)
- G_GNUC_WARN_UNUSED_RESULT;
-gboolean egg_obj_list_to_file (EggObjList *list,
- const gchar *filename);
-gboolean egg_obj_list_from_file (EggObjList *list,
- const gchar *filename);
-void egg_obj_list_add (EggObjList *list,
- gconstpointer data);
-void egg_obj_list_add_list (EggObjList *list,
- const EggObjList *data);
-void egg_obj_list_remove_list (EggObjList *list,
- const EggObjList *data);
-void egg_obj_list_remove_duplicate (EggObjList *list);
-gboolean egg_obj_list_remove (EggObjList *list,
- gconstpointer data);
-gboolean egg_obj_list_remove_index (EggObjList *list,
- guint index);
-gconstpointer egg_obj_list_index (const EggObjList *list,
- guint index);
-
-G_END_DECLS
-
-#endif /* __EGG_OBJ_LIST_H */
diff --git a/src/Makefile.am b/src/Makefile.am
index 7ae40f8..307c0c1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -10,6 +10,7 @@ INCLUDES = \
-DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \
-DPACKAGE_LIB_DIR=\""$(libdir)"\" \
-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT \
+ -DDKP_COMPILATION \
-DEGG_LOG_FILE=\""$(DKP_LOG_DIR)/DeviceKit-power"\" \
-DEGG_VERBOSE="\"DKP_VERBOSE\"" \
-DEGG_LOGGING="\"DKP_LOGGING\"" \
diff --git a/src/dkp-device.c b/src/dkp-device.c
index 6651aa9..a8fba14 100644
--- a/src/dkp-device.c
+++ b/src/dkp-device.c
@@ -337,7 +337,7 @@ gboolean
dkp_device_get_statistics (DkpDevice *device, const gchar *type, DBusGMethodInvocation *context)
{
GError *error;
- EggObjList *array = NULL;
+ GPtrArray *array = NULL;
GPtrArray *complex;
const DkpStatsObj *obj;
GValue *value;
@@ -376,7 +376,7 @@ dkp_device_get_statistics (DkpDevice *device, const gchar *type, DBusGMethodInvo
/* copy data to dbus struct */
complex = g_ptr_array_sized_new (array->len);
for (i=0; i<array->len; i++) {
- obj = (const DkpStatsObj *) egg_obj_list_index (array, i);
+ obj = (const DkpStatsObj *) g_ptr_array_index (array, i);
value = g_new0 (GValue, 1);
g_value_init (value, DKP_DBUS_STRUCT_DOUBLE_DOUBLE);
g_value_take_boxed (value, dbus_g_type_specialized_construct (DKP_DBUS_STRUCT_DOUBLE_DOUBLE));
@@ -387,8 +387,10 @@ dkp_device_get_statistics (DkpDevice *device, const gchar *type, DBusGMethodInvo
dbus_g_method_return (context, complex);
out:
- if (array != NULL)
- g_object_unref (array);
+ if (array != NULL) {
+ g_ptr_array_foreach (array, (GFunc) dkp_stats_obj_free, NULL);
+ g_ptr_array_free (array, TRUE);
+ }
return TRUE;
}
@@ -399,7 +401,7 @@ gboolean
dkp_device_get_history (DkpDevice *device, const gchar *type_string, guint timespan, guint resolution, DBusGMethodInvocation *context)
{
GError *error;
- EggObjList *array = NULL;
+ GPtrArray *array = NULL;
GPtrArray *complex;
const DkpHistoryObj *obj;
GValue *value;
@@ -440,7 +442,7 @@ dkp_device_get_history (DkpDevice *device, const gchar *type_string, guint times
/* copy data to dbus struct */
complex = g_ptr_array_sized_new (array->len);
for (i=0; i<array->len; i++) {
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, i);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, i);
value = g_new0 (GValue, 1);
g_value_init (value, DKP_DBUS_STRUCT_UINT_DOUBLE_STRING);
g_value_take_boxed (value, dbus_g_type_specialized_construct (DKP_DBUS_STRUCT_UINT_DOUBLE_STRING));
@@ -451,8 +453,10 @@ dkp_device_get_history (DkpDevice *device, const gchar *type_string, guint times
dbus_g_method_return (context, complex);
out:
- if (array != NULL)
- g_object_unref (array);
+ if (array != NULL) {
+ g_ptr_array_foreach (array, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (array, TRUE);
+ }
return TRUE;
}
diff --git a/src/dkp-history.c b/src/dkp-history.c
index 6ccca01..edc6572 100644
--- a/src/dkp-history.c
+++ b/src/dkp-history.c
@@ -48,10 +48,10 @@ struct DkpHistoryPrivate
gint64 time_empty_last;
gdouble percentage_last;
DkpDeviceState state;
- EggObjList *data_rate;
- EggObjList *data_charge;
- EggObjList *data_time_full;
- EggObjList *data_time_empty;
+ GPtrArray *data_rate;
+ GPtrArray *data_charge;
+ GPtrArray *data_time_full;
+ GPtrArray *data_time_empty;
guint save_id;
};
@@ -64,38 +64,6 @@ G_DEFINE_TYPE (DkpHistory, dkp_history, G_TYPE_OBJECT)
#define DKP_HISTORY_FILE_HEADER "PackageKit Profile"
/**
- * dkp_history_get_history_list:
- **/
-static EggObjList *
-dkp_history_new_history_list (void)
-{
- EggObjList *list;
- list = egg_obj_list_new ();
- egg_obj_list_set_new (list, (EggObjListNewFunc) dkp_history_obj_new);
- egg_obj_list_set_copy (list, (EggObjListCopyFunc) dkp_history_obj_copy);
- egg_obj_list_set_free (list, (EggObjListFreeFunc) dkp_history_obj_free);
- egg_obj_list_set_to_string (list, (EggObjListToStringFunc) dkp_history_obj_to_string);
- egg_obj_list_set_from_string (list, (EggObjListFromStringFunc) dkp_history_obj_from_string);
- return list;
-}
-
-/**
- * dkp_history_get_stats_list:
- **/
-static EggObjList *
-dkp_history_new_stats_list (void)
-{
- EggObjList *list;
- list = egg_obj_list_new ();
- egg_obj_list_set_new (list, (EggObjListNewFunc) dkp_stats_obj_new);
- egg_obj_list_set_copy (list, (EggObjListCopyFunc) dkp_stats_obj_copy);
- egg_obj_list_set_free (list, (EggObjListFreeFunc) dkp_stats_obj_free);
- egg_obj_list_set_to_string (list, (EggObjListToStringFunc) dkp_stats_obj_to_string);
- egg_obj_list_set_from_string (list, (EggObjListFromStringFunc) dkp_stats_obj_from_string);
- return list;
-}
-
-/**
* dkp_history_array_limit_resolution:
* @array: The data we have for a specific graph
* @max_num: The max desired points
@@ -128,8 +96,8 @@ dkp_history_new_stats_list (void)
* 2 = 41,70
* 3 = 85,30
**/
-static EggObjList *
-dkp_history_array_limit_resolution (EggObjList *array, guint max_num)
+static GPtrArray *
+dkp_history_array_limit_resolution (GPtrArray *array, guint max_num)
{
const DkpHistoryObj *obj;
DkpHistoryObj *nobj;
@@ -138,7 +106,7 @@ dkp_history_array_limit_resolution (EggObjList *array, guint max_num)
gint i;
guint last;
guint first;
- EggObjList *new;
+ GPtrArray *new;
DkpDeviceState state = DKP_DEVICE_STATE_UNKNOWN;
guint64 time = 0;
gdouble value = 0;
@@ -153,14 +121,13 @@ dkp_history_array_limit_resolution (EggObjList *array, guint max_num)
goto out;
}
- new = dkp_history_new_stats_list ();
- nobj = dkp_history_obj_new ();
+ new = g_ptr_array_new ();
egg_debug ("length of array (before) %i", array->len);
/* last element */
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, length-1);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, length-1);
last = obj->time;
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, 0);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, 0);
first = obj->time;
div = (first - last) / (gfloat) max_num;
@@ -170,15 +137,16 @@ dkp_history_array_limit_resolution (EggObjList *array, guint max_num)
* division algorithm so we don't keep diluting the previous
* data with a conventional 1-in-x type algorithm. */
for (i=length-1; i>=0; i--) {
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, i);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, i);
preset = last + (div * (gfloat) step);
/* if state changed or we went over the preset do a new point */
if (count > 0 && (obj->time > preset || obj->state != state)) {
+ nobj = dkp_history_obj_new ();
nobj->time = time / count;
nobj->value = value / count;
nobj->state = state;
- egg_obj_list_add (new, nobj);
+ g_ptr_array_add (new, nobj);
step++;
time = obj->time;
@@ -192,14 +160,14 @@ dkp_history_array_limit_resolution (EggObjList *array, guint max_num)
}
}
+ nobj = dkp_history_obj_new ();
nobj->time = time / count;
nobj->value = value / count;
nobj->state = state;
- egg_obj_list_add (new, nobj);
+ g_ptr_array_add (new, nobj);
/* check length */
egg_debug ("length of array (after) %i", new->len);
- dkp_history_obj_free (nobj);
out:
return new;
}
@@ -207,12 +175,12 @@ out:
/**
* dkp_history_copy_array_timespan:
**/
-static EggObjList *
-dkp_history_copy_array_timespan (const EggObjList *array, guint timespan)
+static GPtrArray *
+dkp_history_copy_array_timespan (const GPtrArray *array, guint timespan)
{
guint i;
const DkpHistoryObj *obj;
- EggObjList *array_new;
+ GPtrArray *array_new;
guint start;
/* no data */
@@ -220,16 +188,16 @@ dkp_history_copy_array_timespan (const EggObjList *array, guint timespan)
return NULL;
/* new data */
- array_new = dkp_history_new_history_list ();
+ array_new = g_ptr_array_new ();
/* treat the timespan like a range, and search backwards */
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, array->len-1);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, array->len-1);
start = obj->time;
timespan *= 0.95f;
for (i=array->len-1; i>0; i--) {
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, i);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, i);
if (start - obj->time < timespan)
- egg_obj_list_add (array_new, (const gpointer) obj);
+ g_ptr_array_add (array_new, dkp_history_obj_copy (obj));
}
return array_new;
@@ -238,12 +206,12 @@ dkp_history_copy_array_timespan (const EggObjList *array, guint timespan)
/**
* dkp_history_get_data:
**/
-EggObjList *
+GPtrArray *
dkp_history_get_data (DkpHistory *history, DkpHistoryType type, guint timespan, guint resolution)
{
- EggObjList *array;
- EggObjList *array_resolution;
- const EggObjList *array_data = NULL;
+ GPtrArray *array;
+ GPtrArray *array_resolution;
+ const GPtrArray *array_data = NULL;
g_return_val_if_fail (DKP_IS_HISTORY (history), NULL);
@@ -270,7 +238,8 @@ dkp_history_get_data (DkpHistory *history, DkpHistoryType type, guint timespan,
/* only add a certain number of points */
array_resolution = dkp_history_array_limit_resolution (array, resolution);
- g_object_unref (array);
+ g_ptr_array_foreach (array, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (array, TRUE);
return array_resolution;
}
@@ -278,7 +247,7 @@ dkp_history_get_data (DkpHistory *history, DkpHistoryType type, guint timespan,
/**
* dkp_history_get_profile_data:
**/
-EggObjList *
+GPtrArray *
dkp_history_get_profile_data (DkpHistory *history, gboolean charging)
{
guint i;
@@ -290,8 +259,8 @@ dkp_history_get_profile_data (DkpHistory *history, gboolean charging)
const DkpHistoryObj *obj;
const DkpHistoryObj *obj_old = NULL;
DkpStatsObj *stats;
- EggObjList *array;
- EggObjList *data;
+ GPtrArray *array;
+ GPtrArray *data;
guint time;
gdouble value;
gdouble total_value = 0.0f;
@@ -299,16 +268,15 @@ dkp_history_get_profile_data (DkpHistory *history, gboolean charging)
g_return_val_if_fail (DKP_IS_HISTORY (history), NULL);
/* create 100 item list and set to zero */
- data = dkp_history_new_stats_list ();
+ data = g_ptr_array_new ();
for (i=0; i<101; i++) {
stats = dkp_stats_obj_create (0.0f, 0.0f);
- egg_obj_list_add (data, stats);
- dkp_stats_obj_free (stats);
+ g_ptr_array_add (data, stats);
}
array = history->priv->data_charge;
for (i=0; i<array->len; i++) {
- obj = (const DkpHistoryObj *) egg_obj_list_index (array, i);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (array, i);
if (obj_last == NULL || obj->state != obj_last->state) {
obj_old = NULL;
goto cont;
@@ -334,7 +302,7 @@ dkp_history_get_profile_data (DkpHistory *history, gboolean charging)
/* use the accuracy field as a counter for now */
if ((charging && obj->state == DKP_DEVICE_STATE_CHARGING) ||
(!charging && obj->state == DKP_DEVICE_STATE_DISCHARGING)) {
- stats = (DkpStatsObj *) egg_obj_list_index (data, bin);
+ stats = (DkpStatsObj *) g_ptr_array_index (data, bin);
stats->value += time;
stats->accuracy++;
}
@@ -347,14 +315,14 @@ cont:
/* divide the value by the number of samples to make the average */
for (i=0; i<101; i++) {
- stats = (DkpStatsObj *) egg_obj_list_index (data, i);
+ stats = (DkpStatsObj *) g_ptr_array_index (data, i);
if (stats->accuracy != 0)
stats->value = stats->value / stats->accuracy;
}
/* find non-zero accuracy values for the average */
for (i=0; i<101; i++) {
- stats = (DkpStatsObj *) egg_obj_list_index (data, i);
+ stats = (DkpStatsObj *) g_ptr_array_index (data, i);
if (stats->accuracy > 0) {
total_value += stats->value;
non_zero_accuracy++;
@@ -369,7 +337,7 @@ cont:
/* make the values a factor of 0, so that 1.0 is twice the
* average, and -1.0 is half the average */
for (i=0; i<101; i++) {
- stats = (DkpStatsObj *) egg_obj_list_index (data, i);
+ stats = (DkpStatsObj *) g_ptr_array_index (data, i);
if (stats->accuracy > 0)
stats->value = (stats->value - average) / average;
else
@@ -378,7 +346,7 @@ cont:
/* accuracy is a percentage scale, where each cycle = 20% */
for (i=0; i<101; i++) {
- stats = (DkpStatsObj *) egg_obj_list_index (data, i);
+ stats = (DkpStatsObj *) g_ptr_array_index (data, i);
stats->accuracy *= 20;
if (stats->accuracy > 100.0f)
stats->accuracy = 100.0f;
@@ -403,6 +371,112 @@ dkp_history_get_filename (DkpHistory *history, const gchar *type)
}
/**
+ * dkp_history_array_to_file:
+ * @list: a valid #GPtrArray instance
+ * @filename: a filename
+ *
+ * Saves a copy of the list to a file
+ **/
+static gboolean
+dkp_history_array_to_file (GPtrArray *list, const gchar *filename)
+{
+ guint i;
+ const DkpHistoryObj *obj;
+ gchar *part;
+ GString *string;
+ gboolean ret = TRUE;
+ GError *error = NULL;
+
+ /* generate data */
+ string = g_string_new ("");
+ for (i=0; i<list->len; i++) {
+ obj = g_ptr_array_index (list, i);
+ part = dkp_history_obj_to_string (obj);
+ if (part == NULL) {
+ ret = FALSE;
+ break;
+ }
+ g_string_append_printf (string, "%s\n", part);
+ g_free (part);
+ }
+ part = g_string_free (string, FALSE);
+
+ /* we failed to convert to string */
+ if (!ret) {
+ egg_warning ("failed to convert");
+ goto out;
+ }
+
+ /* save to disk */
+ ret = g_file_set_contents (filename, part, -1, &error);
+ if (!ret) {
+ egg_warning ("failed to set data: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+ egg_debug ("saved %s", filename);
+
+out:
+ g_free (part);
+ return ret;
+}
+
+/**
+ * dkp_history_array_from_file:
+ * @list: a valid #GPtrArray instance
+ * @filename: a filename
+ *
+ * Appends the list from a file
+ **/
+static gboolean
+dkp_history_array_from_file (GPtrArray *list, const gchar *filename)
+{
+ gboolean ret;
+ GError *error = NULL;
+ gchar *data = NULL;
+ gchar **parts = NULL;
+ guint i;
+ guint length;
+ DkpHistoryObj *obj;
+
+ /* do we exist */
+ ret = g_file_test (filename, G_FILE_TEST_EXISTS);
+ if (!ret) {
+ egg_debug ("failed to get data from %s as file does not exist", filename);
+ goto out;
+ }
+
+ /* get contents */
+ ret = g_file_get_contents (filename, &data, NULL, &error);
+ if (!ret) {
+ egg_warning ("failed to get data: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ /* split by line ending */
+ parts = g_strsplit (data, "\n", 0);
+ length = g_strv_length (parts);
+ if (length == 0) {
+ egg_debug ("no data in %s", filename);
+ goto out;
+ }
+
+ /* add valid entries */
+ egg_debug ("loading %i items of data from %s", length, filename);
+ for (i=0; i<length-1; i++) {
+ obj = dkp_history_obj_from_string (parts[i]);
+ if (obj != NULL)
+ g_ptr_array_add (list, obj);
+ }
+
+out:
+ g_strfreev (parts);
+ g_free (data);
+ return ret;
+}
+
+/**
* dkp_history_save_data:
**/
static gboolean
@@ -418,22 +492,22 @@ dkp_history_save_data (DkpHistory *history)
/* save rate history to disk */
filename = dkp_history_get_filename (history, "rate");
- egg_obj_list_to_file (history->priv->data_rate, filename);
+ dkp_history_array_to_file (history->priv->data_rate, filename);
g_free (filename);
/* save charge history to disk */
filename = dkp_history_get_filename (history, "charge");
- egg_obj_list_to_file (history->priv->data_charge, filename);
+ dkp_history_array_to_file (history->priv->data_charge, filename);
g_free (filename);
/* save charge history to disk */
filename = dkp_history_get_filename (history, "time-full");
- egg_obj_list_to_file (history->priv->data_time_full, filename);
+ dkp_history_array_to_file (history->priv->data_time_full, filename);
g_free (filename);
/* save charge history to disk */
filename = dkp_history_get_filename (history, "time-empty");
- egg_obj_list_to_file (history->priv->data_time_empty, filename);
+ dkp_history_array_to_file (history->priv->data_time_empty, filename);
g_free (filename);
return TRUE;
@@ -469,7 +543,7 @@ dkp_history_is_low_power (DkpHistory *history)
return FALSE;
/* get the last saved charge object */
- obj = (const DkpHistoryObj *) egg_obj_list_index (history->priv->data_charge, length-1);
+ obj = (const DkpHistoryObj *) g_ptr_array_index (history->priv->data_charge, length-1);
if (obj->state != DKP_DEVICE_STATE_DISCHARGING)
return FALSE;
@@ -522,30 +596,30 @@ dkp_history_load_data (DkpHistory *history)
/* load rate history from disk */
filename = dkp_history_get_filename (history, "rate");
- egg_obj_list_from_file (history->priv->data_rate, filename);
+ dkp_history_array_from_file (history->priv->data_rate, filename);
g_free (filename);
/* load charge history from disk */
filename = dkp_history_get_filename (history, "charge");
- egg_obj_list_from_file (history->priv->data_charge, filename);
+ dkp_history_array_from_file (history->priv->data_charge, filename);
g_free (filename);
/* load charge history from disk */
filename = dkp_history_get_filename (history, "time-full");
- egg_obj_list_from_file (history->priv->data_time_full, filename);
+ dkp_history_array_from_file (history->priv->data_time_full, filename);
g_free (filename);
/* load charge history from disk */
filename = dkp_history_get_filename (history, "time-empty");
- egg_obj_list_from_file (history->priv->data_time_empty, filename);
+ dkp_history_array_from_file (history->priv->data_time_empty, filename);
g_free (filename);
/* save a marker so we don't use incomplete percentages */
obj = dkp_history_obj_create (0, DKP_DEVICE_STATE_UNKNOWN);
- egg_obj_list_add (history->priv->data_rate, obj);
- egg_obj_list_add (history->priv->data_charge, obj);
- egg_obj_list_add (history->priv->data_time_full, obj);
- egg_obj_list_add (history->priv->data_time_empty, obj);
+ g_ptr_array_add (history->priv->data_rate, dkp_history_obj_copy (obj));
+ g_ptr_array_add (history->priv->data_charge, dkp_history_obj_copy (obj));
+ g_ptr_array_add (history->priv->data_time_full, dkp_history_obj_copy (obj));
+ g_ptr_array_add (history->priv->data_time_empty, dkp_history_obj_copy (obj));
dkp_history_obj_free (obj);
dkp_history_schedule_save (history);
@@ -607,8 +681,7 @@ dkp_history_set_charge_data (DkpHistory *history, gdouble percentage)
/* add to array and schedule save file */
obj = dkp_history_obj_create (percentage, history->priv->state);
- egg_obj_list_add (history->priv->data_charge, obj);
- dkp_history_obj_free (obj);
+ g_ptr_array_add (history->priv->data_charge, obj);
dkp_history_schedule_save (history);
/* save last value */
@@ -636,8 +709,7 @@ dkp_history_set_rate_data (DkpHistory *history, gdouble rate)
/* add to array and schedule save file */
obj = dkp_history_obj_create (rate, history->priv->state);
- egg_obj_list_add (history->priv->data_rate, obj);
- dkp_history_obj_free (obj);
+ g_ptr_array_add (history->priv->data_rate, obj);
dkp_history_schedule_save (history);
/* save last value */
@@ -667,8 +739,7 @@ dkp_history_set_time_full_data (DkpHistory *history, gint64 time)
/* add to array and schedule save file */
obj = dkp_history_obj_create ((gdouble) time, history->priv->state);
- egg_obj_list_add (history->priv->data_time_full, obj);
- dkp_history_obj_free (obj);
+ g_ptr_array_add (history->priv->data_time_full, obj);
dkp_history_schedule_save (history);
/* save last value */
@@ -698,8 +769,7 @@ dkp_history_set_time_empty_data (DkpHistory *history, gint64 time)
/* add to array and schedule save file */
obj = dkp_history_obj_create ((gdouble) time, history->priv->state);
- egg_obj_list_add (history->priv->data_time_empty, obj);
- dkp_history_obj_free (obj);
+ g_ptr_array_add (history->priv->data_time_empty, obj);
dkp_history_schedule_save (history);
/* save last value */
@@ -732,10 +802,10 @@ dkp_history_init (DkpHistory *history)
history->priv->rate_last = 0;
history->priv->percentage_last = 0;
history->priv->state = DKP_DEVICE_STATE_UNKNOWN;
- history->priv->data_rate = dkp_history_new_history_list ();
- history->priv->data_charge = dkp_history_new_history_list ();
- history->priv->data_time_full = dkp_history_new_history_list ();
- history->priv->data_time_empty = dkp_history_new_history_list ();
+ history->priv->data_rate = g_ptr_array_new ();
+ history->priv->data_charge = g_ptr_array_new ();
+ history->priv->data_time_full = g_ptr_array_new ();
+ history->priv->data_time_empty = g_ptr_array_new ();
history->priv->save_id = 0;
}
@@ -757,10 +827,16 @@ dkp_history_finalize (GObject *object)
g_source_remove (history->priv->save_id);
if (history->priv->id != NULL)
dkp_history_save_data (history);
- g_object_unref (history->priv->data_rate);
- g_object_unref (history->priv->data_charge);
- g_object_unref (history->priv->data_time_full);
- g_object_unref (history->priv->data_time_empty);
+
+ g_ptr_array_foreach (history->priv->data_rate, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (history->priv->data_rate, TRUE);
+ g_ptr_array_foreach (history->priv->data_charge, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (history->priv->data_charge, TRUE);
+ g_ptr_array_foreach (history->priv->data_time_full, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (history->priv->data_time_full, TRUE);
+ g_ptr_array_foreach (history->priv->data_time_empty, (GFunc) dkp_history_obj_free, NULL);
+ g_ptr_array_free (history->priv->data_time_empty, TRUE);
+
g_free (history->priv->id);
g_return_if_fail (history->priv != NULL);
diff --git a/src/dkp-history.h b/src/dkp-history.h
index 2428885..34df32d 100644
--- a/src/dkp-history.h
+++ b/src/dkp-history.h
@@ -62,11 +62,11 @@ typedef enum {
GType dkp_history_get_type (void);
DkpHistory *dkp_history_new (void);
-EggObjList *dkp_history_get_data (DkpHistory *history,
+GPtrArray *dkp_history_get_data (DkpHistory *history,
DkpHistoryType type,
guint timespan,
guint resolution);
-EggObjList *dkp_history_get_profile_data (DkpHistory *history,
+GPtrArray *dkp_history_get_profile_data (DkpHistory *history,
gboolean charging);
gboolean dkp_history_set_id (DkpHistory *history,
const gchar *id);
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 30fb7d8..5cb8523 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -9,6 +9,7 @@ INCLUDES = \
-DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \
-DPACKAGE_LIB_DIR=\""$(libdir)"\" \
-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT \
+ -DDKP_COMPILATION \
-DEGG_LOG_FILE=\""$(DKP_LOG_DIR)/DeviceKit-power"\" \
-DEGG_VERBOSE="\"DKP_VERBOSE\"" \
-DEGG_LOGGING="\"DKP_LOGGING\"" \