/* * SystemBackendProc.cpp * * Copyright (C) 2008 Matthias Schiffer * * 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 3 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 . */ #include "SystemBackendProc.h" #include #include #include #include #define init SystemBackendProc_LTX_init #define deinit SystemBackendProc_LTX_deinit namespace Mad { namespace Modules { SystemBackendProc *SystemBackendProc::backend = 0; bool SystemBackendProc::getUptimeInfo(const boost::function2 &callback) { unsigned long uptime = 0, idleTime = 0; uptimeFile.seekg(0, std::ios::beg); if(!uptimeFile.good()) return false; float f; uptimeFile >> f; if(!uptimeFile.good()) return false; uptime = (unsigned long)f; uptimeFile >> f; if(uptimeFile.good()) idleTime = (unsigned long)f; Common::ActionManager::get()->add(boost::bind(callback, uptime, idleTime)); return true; } bool SystemBackendProc::getMemoryInfo(const boost::function4 &callback) { unsigned long totalMem = 0, freeMem = 0, totalSwap = 0, freeSwap = 0; meminfoFile.seekg(0, std::ios::beg); if(!meminfoFile.good()) return false; while(!meminfoFile.eof() && meminfoFile.good()) { std::string line; std::getline(meminfoFile, line); char *name = new char[line.length()+1]; // is always long enough unsigned long value; if(std::sscanf(line.c_str(), "%s %lu", name, &value) == 2) { if(std::strcmp(name, "MemTotal:") == 0) totalMem = value; else if(std::strcmp(name, "MemFree:") == 0) freeMem = value; else if(std::strcmp(name, "SwapTotal:") == 0) totalSwap = value; else if(std::strcmp(name, "SwapFree:") == 0) freeSwap = value; } delete [] name; if(totalMem && freeMem && totalSwap && freeSwap) break; } Common::ActionManager::get()->add(boost::bind(callback, totalMem, freeMem, totalSwap, freeSwap)); return true; } bool SystemBackendProc::getLoadInfo(const boost::function5 &callback) { unsigned long currentLoad = 0, nProcesses = 0; float loadAvg1 = 0, loadAvg5 = 0, loadAvg15 = 0; loadFile.seekg(0, std::ios::beg); if(!loadFile.good()) return false; std::string line; std::getline(loadFile, line); if(line.empty()) return false; std::sscanf(line.c_str(), "%f %f %f %lu/%lu", &loadAvg1, &loadAvg5, &loadAvg15, ¤tLoad, &nProcesses); Common::ActionManager::get()->add(boost::bind(callback, currentLoad, nProcesses, loadAvg1, loadAvg5, loadAvg15)); return true; } } } extern "C" { void init() { Mad::Modules::SystemBackendProc::registerBackend(); } void deinit() { Mad::Modules::SystemBackendProc::unregisterBackend(); } }