#include <MessageRunner.h>
#include <Application.h>
#include <AppMisc.h>
#include <RegistrarDefs.h>
#include <Roster.h>
#include <RosterPrivate.h>
using namespace BPrivate;
BMessageRunner::BMessageRunner(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count)
:
fToken(-1)
{
_InitData(target, message, interval, count, be_app_messenger);
}
BMessageRunner::BMessageRunner(BMessenger target, const BMessage& message,
bigtime_t interval, int32 count)
:
fToken(-1)
{
_InitData(target, &message, interval, count, be_app_messenger);
}
BMessageRunner::BMessageRunner(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count, BMessenger replyTo)
:
fToken(-1)
{
_InitData(target, message, interval, count, replyTo);
}
BMessageRunner::BMessageRunner(BMessenger target, const BMessage& message,
bigtime_t interval, int32 count, BMessenger replyTo)
:
fToken(-1)
{
_InitData(target, &message, interval, count, replyTo);
}
BMessageRunner::~BMessageRunner()
{
if (fToken < B_OK)
return;
BMessage request(B_REG_UNREGISTER_MESSAGE_RUNNER);
status_t result = request.AddInt32("token", fToken);
BMessage reply;
if (result == B_OK)
result = BRoster::Private().SendTo(&request, &reply, false);
}
status_t
BMessageRunner::InitCheck() const
{
return fToken >= 0 ? B_OK : fToken;
}
status_t
BMessageRunner::SetInterval(bigtime_t interval)
{
return _SetParams(true, interval, false, 0);
}
status_t
BMessageRunner::SetCount(int32 count)
{
return _SetParams(false, 0, true, count);
}
status_t
BMessageRunner::GetInfo(bigtime_t* interval, int32* count) const
{
status_t result = fToken >= 0 ? B_OK : B_BAD_VALUE;
BMessage request(B_REG_GET_MESSAGE_RUNNER_INFO);
if (result == B_OK)
result = request.AddInt32("token", fToken);
BMessage reply;
if (result == B_OK)
result = BRoster::Private().SendTo(&request, &reply, false);
if (result == B_OK) {
if (reply.what == B_REG_SUCCESS) {
int32 _count;
if (reply.FindInt32("count", &_count) == B_OK) {
if (count != 0)
*count = _count;
} else
result = B_ERROR;
bigtime_t _interval;
if (reply.FindInt64("interval", &_interval) == B_OK) {
if (interval != 0)
*interval = _interval;
} else
result = B_ERROR;
} else {
if (reply.FindInt32("error", &result) != B_OK)
result = B_ERROR;
}
}
return result;
}
status_t
BMessageRunner::StartSending(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count)
{
int32 token = _RegisterRunner(target, message, interval, count, true,
be_app_messenger);
return token >= B_OK ? B_OK : token;
}
status_t
BMessageRunner::StartSending(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count, BMessenger replyTo)
{
int32 token = _RegisterRunner(target, message, interval, count, true,
replyTo);
return token >= B_OK ? B_OK : token;
}
void BMessageRunner::_ReservedMessageRunner1() {}
void BMessageRunner::_ReservedMessageRunner2() {}
void BMessageRunner::_ReservedMessageRunner3() {}
void BMessageRunner::_ReservedMessageRunner4() {}
void BMessageRunner::_ReservedMessageRunner5() {}
void BMessageRunner::_ReservedMessageRunner6() {}
#ifdef __HAIKU_BEOS_COMPATIBLE
BMessageRunner::BMessageRunner(const BMessageRunner &)
:
fToken(-1)
{
}
BMessageRunner&
BMessageRunner::operator=(const BMessageRunner&)
{
return* this;
}
#endif
void
BMessageRunner::_InitData(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count, BMessenger replyTo)
{
fToken = _RegisterRunner(target, message, interval, count, false, replyTo);
}
int32
BMessageRunner::_RegisterRunner(BMessenger target, const BMessage* message,
bigtime_t interval, int32 count, bool detach, BMessenger replyTo)
{
status_t result = B_OK;
if (message == NULL || count == 0 || (count < 0 && detach))
result = B_BAD_VALUE;
BMessage request(B_REG_REGISTER_MESSAGE_RUNNER);
if (result == B_OK)
result = request.AddInt32("team", BPrivate::current_team());
if (result == B_OK)
result = request.AddMessenger("target", target);
if (result == B_OK)
result = request.AddMessage("message", message);
if (result == B_OK)
result = request.AddInt64("interval", interval);
if (result == B_OK)
result = request.AddInt32("count", count);
if (result == B_OK)
result = request.AddMessenger("reply_target", replyTo);
BMessage reply;
if (result == B_OK)
result = BRoster::Private().SendTo(&request, &reply, false);
int32 token;
if (result == B_OK) {
if (reply.what == B_REG_SUCCESS) {
if (reply.FindInt32("token", &token) != B_OK)
result = B_ERROR;
} else {
if (reply.FindInt32("error", &result) != B_OK)
result = B_ERROR;
}
}
if (result == B_OK)
return token;
return result;
}
status_t
BMessageRunner::_SetParams(bool resetInterval, bigtime_t interval,
bool resetCount, int32 count)
{
if ((!resetInterval && !resetCount) || fToken < 0)
return B_BAD_VALUE;
BMessage request(B_REG_SET_MESSAGE_RUNNER_PARAMS);
status_t result = request.AddInt32("token", fToken);
if (result == B_OK && resetInterval)
result = request.AddInt64("interval", interval);
if (result == B_OK && resetCount)
result = request.AddInt32("count", count);
BMessage reply;
if (result == B_OK)
result = BRoster::Private().SendTo(&request, &reply, false);
if (result == B_OK) {
if (reply.what != B_REG_SUCCESS) {
if (reply.FindInt32("error", &result) != B_OK)
result = B_ERROR;
}
}
return result;
}