#pragma once
#include <gio/gio.h>
#include <string>
#include "DBusObjectPath.h"
#include "Logger.h"
namespace ggk {
struct DBusInterface;
struct TickEvent
{
typedef void (*Callback)(const DBusInterface &self, const TickEvent &event, GDBusConnection *pConnection, void *pUserData);
TickEvent(const DBusInterface *pOwner, int tickFrequency, Callback callback, void *pUserData)
: pOwner(pOwner), elapsedTicks(0), tickFrequency(tickFrequency), callback(callback), pUserData(pUserData)
{
}
int getElapsedTicks() const { return elapsedTicks; }
void setElapsedTicks(int elapsed) { elapsedTicks = elapsed; }
int getTickFrequency() const { return tickFrequency; }
void setTickFrequency(int frequency) { tickFrequency = frequency; }
void *getUserData() { return pUserData; }
void setUserData(void *pUserData) { this->pUserData = pUserData; }
Callback getCallback() const { return callback; }
void setCallback(Callback callback) { this->callback = callback; }
template<typename T>
void tick(const DBusObjectPath &path, GDBusConnection *pConnection, void *pUserData) const
{
elapsedTicks += 1;
if (elapsedTicks >= tickFrequency)
{
if (nullptr != callback)
{
Logger::debug(SSTR << "Ticking at path '" << path << "'");
callback(*static_cast<const T *>(pOwner), *this, pConnection, pUserData);
}
elapsedTicks = 0;
}
}
private:
const DBusInterface *pOwner;
mutable int elapsedTicks;
int tickFrequency;
Callback callback;
void *pUserData;
};
};