blob: e530e06051384c2fdb5b82c00a110700c85cd3d5 [file] [log] [blame]
/*
*
* D-Bus++ - C++ bindings for D-Bus
*
* Copyright (C) 2005-2007 Paolo Durante <shackan@gmail.com>
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <dbus-c++/ecore-integration.h>
#include <dbus/dbus.h> // for DBUS_WATCH_*
using namespace DBus;
Ecore::BusTimeout::BusTimeout( Timeout::Internal* ti)
: Timeout(ti)
{
_enable();
}
Ecore::BusTimeout::~BusTimeout()
{
_disable();
}
void Ecore::BusTimeout::toggle()
{
debug_log("ecore: timeout %p toggled (%s)", this, Timeout::enabled() ? "on":"off");
if(Timeout::enabled()) _enable();
else _disable();
}
int Ecore::BusTimeout::timeout_handler( void *data )
{
Ecore::BusTimeout* t = reinterpret_cast<Ecore::BusTimeout*>(data);
debug_log("Ecore::BusTimeout::timeout_handler( void *data )");
t->handle();
return 1; // 1 -> reshedule in ecore for next timer interval
}
void Ecore::BusTimeout::_enable()
{
debug_log("Ecore::BusTimeout::_enable()");
_etimer = ecore_timer_add (((double)Timeout::interval())/1000, timeout_handler, this);
}
void Ecore::BusTimeout::_disable()
{
debug_log("Ecore::BusTimeout::_disable()");
ecore_timer_del (_etimer);
}
/*static bool watch_prepare( int *timeout )
{
debug_log("ecore: watch_prepare");
*timeout = -1;
return false;
}*/
/*static bool watch_check( )
{
debug_log("ecore: watch_check");
return true;
}*/
static bool watch_dispatch( void *data )
{
debug_log("ecore: watch_dispatch");
bool cb = true;
DBus::default_dispatcher->dispatch_pending(); //TODO: won't work in case of multiple dispatchers
return cb;
}
Ecore::BusWatch::BusWatch( Watch::Internal* wi)
: Watch(wi)
{
_enable();
}
Ecore::BusWatch::~BusWatch()
{
_disable();
}
void Ecore::BusWatch::toggle()
{
debug_log("ecore: watch %p toggled (%s)", this, Watch::enabled() ? "on":"off");
if(Watch::enabled()) _enable();
else _disable();
}
int Ecore::BusWatch::watch_handler_read( void *data, Ecore_Fd_Handler *fdh )
{
Ecore::BusWatch* w = reinterpret_cast<Ecore::BusWatch*>(data);
debug_log("ecore: watch_handler_read");
int flags = DBUS_WATCH_READABLE;
watch_dispatch(NULL);
w->handle(flags);
return 1;
}
int Ecore::BusWatch::watch_handler_error( void *data, Ecore_Fd_Handler *fdh )
{
//Ecore::BusWatch* w = reinterpret_cast<Ecore::BusWatch*>(data);
debug_log("ecore: watch_handler_error");
//int flags = DBUS_WATCH_ERROR;
watch_dispatch(NULL);
return 1;
}
void Ecore::BusWatch::_enable()
{
debug_log("Ecore::BusWatch::_enable()");
//int flags = Watch::flags();
fd_handler_read = ecore_main_fd_handler_add (Watch::descriptor(),
ECORE_FD_READ,
watch_handler_read,
this,
NULL, NULL);
ecore_main_fd_handler_active_set(fd_handler_read, ECORE_FD_READ);
fd_handler_error = ecore_main_fd_handler_add (Watch::descriptor(),
ECORE_FD_ERROR,
watch_handler_error,
this,
NULL, NULL);
ecore_main_fd_handler_active_set(fd_handler_error, ECORE_FD_ERROR);
}
void Ecore::BusWatch::_disable()
{
ecore_main_fd_handler_del (fd_handler_read);
ecore_main_fd_handler_del (fd_handler_error);
}
void Ecore::BusDispatcher::attach( )
{
}
Timeout* Ecore::BusDispatcher::add_timeout( Timeout::Internal* wi )
{
Timeout* t = new Ecore::BusTimeout( wi );
debug_log("ecore: added timeout %p (%s)", t, t->enabled() ? "on":"off");
return t;
}
void Ecore::BusDispatcher::rem_timeout( Timeout* t )
{
debug_log("ecore: removed timeout %p", t);
delete t;
}
Watch* Ecore::BusDispatcher::add_watch( Watch::Internal* wi )
{
Watch* w = new Ecore::BusWatch(wi);
debug_log("ecore: added watch %p (%s) fd=%d flags=%d",
w, w->enabled() ? "on":"off", w->descriptor(), w->flags()
);
return w;
}
void Ecore::BusDispatcher::rem_watch( Watch* w )
{
debug_log("ecore: removed watch %p", w);
delete w;
}