launch_daemon: Renamed RegisteredEvent to ExternalEventSource.
* With events being registered, this proved to be confusing, and it also helps to differentiate between event objects within the daemon, and events coming from external sources.
This commit is contained in:
@@ -74,12 +74,19 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class RegisteredEvent {
|
/*! This class is the connection between the external events that are part of
|
||||||
|
a job, and the external event source.
|
||||||
|
|
||||||
|
There is one object per registered event source, and it keeps all jobs that
|
||||||
|
reference the event as listeners. If the event source triggers the event,
|
||||||
|
the object will be used to trigger the jobs.
|
||||||
|
*/
|
||||||
|
class ExternalEventSource {
|
||||||
public:
|
public:
|
||||||
RegisteredEvent(BMessenger& source,
|
ExternalEventSource(BMessenger& source,
|
||||||
const char* ownerName,
|
const char* ownerName,
|
||||||
const char* name);
|
const char* name);
|
||||||
~RegisteredEvent();
|
~ExternalEventSource();
|
||||||
|
|
||||||
const char* Name() const;
|
const char* Name() const;
|
||||||
|
|
||||||
@@ -98,7 +105,7 @@ private:
|
|||||||
typedef std::map<BString, Job*> JobMap;
|
typedef std::map<BString, Job*> JobMap;
|
||||||
typedef std::map<uid_t, Session*> SessionMap;
|
typedef std::map<uid_t, Session*> SessionMap;
|
||||||
typedef std::map<BString, Target*> TargetMap;
|
typedef std::map<BString, Target*> TargetMap;
|
||||||
typedef std::map<BString, RegisteredEvent*> EventMap;
|
typedef std::map<BString, ExternalEventSource*> EventMap;
|
||||||
|
|
||||||
|
|
||||||
class LaunchDaemon : public BServer, public Finder, public ConditionContext {
|
class LaunchDaemon : public BServer, public Finder, public ConditionContext {
|
||||||
@@ -153,11 +160,13 @@ private:
|
|||||||
void _SetEnvironment(BaseJob* job,
|
void _SetEnvironment(BaseJob* job,
|
||||||
const BMessage& message);
|
const BMessage& message);
|
||||||
|
|
||||||
RegisteredEvent* _FindEvent(const char* owner,
|
ExternalEventSource*
|
||||||
|
_FindEvent(const char* owner,
|
||||||
const char* name) const;
|
const char* name) const;
|
||||||
void _ResolveRegisteredEvents(RegisteredEvent* event,
|
void _ResolveExternalEvents(
|
||||||
|
ExternalEventSource* event,
|
||||||
const BString& name);
|
const BString& name);
|
||||||
void _ResolveRegisteredEvents(BaseJob* job);
|
void _ResolveExternalEvents(BaseJob* job);
|
||||||
void _ForwardEventMessage(uid_t user,
|
void _ForwardEventMessage(uid_t user,
|
||||||
BMessage* message);
|
BMessage* message);
|
||||||
|
|
||||||
@@ -208,8 +217,8 @@ Session::Session(uid_t user, const BMessenger& daemon)
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
RegisteredEvent::RegisteredEvent(BMessenger& source, const char* ownerName,
|
ExternalEventSource::ExternalEventSource(BMessenger& source,
|
||||||
const char* name)
|
const char* ownerName, const char* name)
|
||||||
:
|
:
|
||||||
fName(name),
|
fName(name),
|
||||||
fListeners(5, true)
|
fListeners(5, true)
|
||||||
@@ -217,34 +226,34 @@ RegisteredEvent::RegisteredEvent(BMessenger& source, const char* ownerName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RegisteredEvent::~RegisteredEvent()
|
ExternalEventSource::~ExternalEventSource()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char*
|
const char*
|
||||||
RegisteredEvent::Name() const
|
ExternalEventSource::Name() const
|
||||||
{
|
{
|
||||||
return fName.String();
|
return fName.String();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32
|
int32
|
||||||
RegisteredEvent::CountListeners() const
|
ExternalEventSource::CountListeners() const
|
||||||
{
|
{
|
||||||
return fListeners.CountItems();
|
return fListeners.CountItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BaseJob*
|
BaseJob*
|
||||||
RegisteredEvent::ListenerAt(int32 index) const
|
ExternalEventSource::ListenerAt(int32 index) const
|
||||||
{
|
{
|
||||||
return fListeners.ItemAt(index);
|
return fListeners.ItemAt(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
RegisteredEvent::AddListener(BaseJob* job)
|
ExternalEventSource::AddListener(BaseJob* job)
|
||||||
{
|
{
|
||||||
if (fListeners.AddItem(job))
|
if (fListeners.AddItem(job))
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -254,7 +263,7 @@ RegisteredEvent::AddListener(BaseJob* job)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
RegisteredEvent::RemoveListener(BaseJob* job)
|
ExternalEventSource::RemoveListener(BaseJob* job)
|
||||||
{
|
{
|
||||||
fListeners.RemoveItem(job);
|
fListeners.RemoveItem(job);
|
||||||
}
|
}
|
||||||
@@ -635,18 +644,18 @@ LaunchDaemon::_HandleRegisterLaunchEvent(BMessage* message)
|
|||||||
// Register event
|
// Register event
|
||||||
ownerName = get_leaf(ownerName);
|
ownerName = get_leaf(ownerName);
|
||||||
|
|
||||||
RegisteredEvent* event = new (std::nothrow) RegisteredEvent(
|
ExternalEventSource* event = new (std::nothrow)
|
||||||
source, ownerName, name);
|
ExternalEventSource(source, ownerName, name);
|
||||||
if (event != NULL) {
|
if (event != NULL) {
|
||||||
// Use short name, and fully qualified name
|
// Use short name, and fully qualified name
|
||||||
BString eventName = name;
|
BString eventName = name;
|
||||||
fEvents.insert(std::make_pair(eventName, event));
|
fEvents.insert(std::make_pair(eventName, event));
|
||||||
_ResolveRegisteredEvents(event, eventName);
|
_ResolveExternalEvents(event, eventName);
|
||||||
|
|
||||||
eventName.Prepend("/");
|
eventName.Prepend("/");
|
||||||
eventName.Prepend(ownerName);
|
eventName.Prepend(ownerName);
|
||||||
fEvents.insert(std::make_pair(eventName, event));
|
fEvents.insert(std::make_pair(eventName, event));
|
||||||
_ResolveRegisteredEvents(event, eventName);
|
_ResolveExternalEvents(event, eventName);
|
||||||
} else
|
} else
|
||||||
status = B_NO_MEMORY;
|
status = B_NO_MEMORY;
|
||||||
} else
|
} else
|
||||||
@@ -708,7 +717,7 @@ LaunchDaemon::_HandleNotifyLaunchEvent(BMessage* message)
|
|||||||
const char* ownerName = message->GetString("owner");
|
const char* ownerName = message->GetString("owner");
|
||||||
// TODO: support arguments (as selectors)
|
// TODO: support arguments (as selectors)
|
||||||
|
|
||||||
RegisteredEvent* event = _FindEvent(ownerName, name);
|
ExternalEventSource* event = _FindEvent(ownerName, name);
|
||||||
if (event != NULL) {
|
if (event != NULL) {
|
||||||
// Evaluate all of its jobs
|
// Evaluate all of its jobs
|
||||||
int32 count = event->CountListeners();
|
int32 count = event->CountListeners();
|
||||||
@@ -1103,7 +1112,7 @@ LaunchDaemon::_SetEvent(BaseJob* job, const BMessage& message)
|
|||||||
|
|
||||||
if (updated) {
|
if (updated) {
|
||||||
job->SetEvent(event);
|
job->SetEvent(event);
|
||||||
_ResolveRegisteredEvents(job);
|
_ResolveExternalEvents(job);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1117,7 +1126,7 @@ LaunchDaemon::_SetEnvironment(BaseJob* job, const BMessage& message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RegisteredEvent*
|
ExternalEventSource*
|
||||||
LaunchDaemon::_FindEvent(const char* owner, const char* name) const
|
LaunchDaemon::_FindEvent(const char* owner, const char* name) const
|
||||||
{
|
{
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
@@ -1145,7 +1154,7 @@ LaunchDaemon::_FindEvent(const char* owner, const char* name) const
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LaunchDaemon::_ResolveRegisteredEvents(RegisteredEvent* event,
|
LaunchDaemon::_ResolveExternalEvents(ExternalEventSource* event,
|
||||||
const BString& name)
|
const BString& name)
|
||||||
{
|
{
|
||||||
for (JobMap::iterator iterator = fJobs.begin(); iterator != fJobs.end();
|
for (JobMap::iterator iterator = fJobs.begin(); iterator != fJobs.end();
|
||||||
@@ -1158,14 +1167,14 @@ LaunchDaemon::_ResolveRegisteredEvents(RegisteredEvent* event,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LaunchDaemon::_ResolveRegisteredEvents(BaseJob* job)
|
LaunchDaemon::_ResolveExternalEvents(BaseJob* job)
|
||||||
{
|
{
|
||||||
if (job->Event() == NULL)
|
if (job->Event() == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (EventMap::iterator iterator = fEvents.begin();
|
for (EventMap::iterator iterator = fEvents.begin();
|
||||||
iterator != fEvents.end(); iterator++) {
|
iterator != fEvents.end(); iterator++) {
|
||||||
RegisteredEvent* event = iterator->second;
|
ExternalEventSource* event = iterator->second;
|
||||||
if (Events::ResolveRegisteredEvent(job->Event(), event->Name()))
|
if (Events::ResolveRegisteredEvent(job->Event(), event->Name()))
|
||||||
event->AddListener(job);
|
event->AddListener(job);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user