rendered paste body#include "batterysrc.h"#include <klocale.h>#include <kdebug.h>#include <iostream>BatterySrc::BatterySrc(QWidget* inParent, QString inUDI): LabelSource(inParent), mTrigger(this, 5000), mUDI(inUDI), mLibHalContext(NULL){ mID = mUDI.section('/', -1); mName = mID; mDescription = i18n("This source displays the current state of charge of your battery."); dbus_error_init(&mDBusError); if((mLibHalContext = libhal_ctx_new()) == NULL){ mLibHalContext = NULL; std::cerr << "error: libmLibHalContext_new" << std::endl; return; } if(!libhal_ctx_set_dbus_connection(mLibHalContext, dbus_bus_get (DBUS_BUS_SYSTEM, &mDBusError))){ std::cerr << "error: libmLibHalContext_set_dbus_connection: " << mDBusError.name << ", " << mDBusError.message << std::endl; dbus_error_free(&mDBusError); mLibHalContext = NULL; mLibHalContext = 0; return; } if(!libhal_ctx_init(mLibHalContext, &mDBusError)){ std::cerr << "error: libmLibHalContext_init: " << mDBusError.name << ", " << mDBusError.message << std::endl; dbus_error_free(&mDBusError); mLibHalContext = NULL; mLibHalContext = 0; return; }}BatterySrc::~BatterySrc(){ if(mLibHalContext != NULL && !libhal_ctx_shutdown(mLibHalContext, &mDBusError)){ std::cerr << "error: libmLibHalContext_shutdown: " << mDBusError.name << ", " << mDBusError.message << std::endl; } libhal_ctx_free(mLibHalContext);}std::list<Source*>BatterySrc::createInstances(QWidget* inParent){ std::list<Source*> list; LibHalContext* libHalContext; DBusError dBusError; dbus_error_init(&dBusError); if((libHalContext = libhal_ctx_new()) == NULL){ std::cerr << "error: libmLibHalContext_new" << std::endl; } if(libHalContext != 0 && !libhal_ctx_set_dbus_connection(libHalContext, dbus_bus_get (DBUS_BUS_SYSTEM, &dBusError))){ std::cerr << "error: libmLibHalContext_set_dbus_connection: " << dBusError.name << ", " << dBusError.message << std::endl; dbus_error_free(&dBusError); libHalContext = 0; } if(libHalContext != 0 && !libhal_ctx_init(libHalContext, &dBusError)){ std::cerr << "error: libmLibHalContext_init: " << dBusError.name << ", " << dBusError.message << std::endl; dbus_error_free(&dBusError); libHalContext = 0; } if(libHalContext){ int num = 0; char** udis = libhal_manager_find_device_string_match(libHalContext, "info.category", "battery", &num, &dBusError); if(!dbus_error_is_set(&dBusError)){ //cout << "num devices: " << num << std::endl; for(int i = 0; i < num; ++i){ if(libhal_device_get_property_type(libHalContext, udis[i], "battery.charge_level.last_full", &dBusError) == LIBHAL_PROPERTY_TYPE_INT32 && libhal_device_get_property_type(libHalContext, udis[i], "battery.charge_level.current", &dBusError) == LIBHAL_PROPERTY_TYPE_INT32){ if(!dbus_error_is_set(&dBusError)) // todo: check whether this check is redundant list.push_back(new BatterySrc(inParent, udis[i])); } if(dbus_error_is_set(&dBusError)) { std::cerr << "error: " << dBusError.name << ", " << dBusError.message << std::endl; dbus_error_free(&dBusError); } } }else{ std::cerr << "error: " << dBusError.name << ", " << dBusError.message << std::endl; dbus_error_free(&dBusError); } if(!libhal_ctx_shutdown(libHalContext, &dBusError)){ std::cerr << "error: libmLibHalContext_shutdown: " << dBusError.name << ", " << dBusError.message << std::endl; } libhal_ctx_free(libHalContext); libhal_free_string_array(udis); } return list;}QString BatterySrc::fetchValue() { QString s = i18n("n/a"); if(mLibHalContext != NULL){ int last_full = 0; int current = 0; last_full = libhal_device_get_property_int(mLibHalContext, mUDI.ascii(), "battery.charge_level.last_full", &mDBusError); if(dbus_error_is_set(&mDBusError)){ dbus_error_free(&mDBusError); return s; } current = libhal_device_get_property_int(mLibHalContext, mUDI.ascii(), "battery.charge_level.current", &mDBusError); if(dbus_error_is_set(&mDBusError)){ dbus_error_free(&mDBusError); return s; } s = QString::number(qRound((current * 100.0) / last_full)) + " %"; } return s;}