Skip to content

Commit

Permalink
launch_daemon: Added support for external events.
Browse files Browse the repository at this point in the history
* Other apps can register events, and the launch_daemon can act on them
  when they are triggered.
  • Loading branch information
axeld committed Jul 22, 2015
1 parent 2c756e1 commit d94e9c9
Show file tree
Hide file tree
Showing 6 changed files with 487 additions and 7 deletions.
5 changes: 4 additions & 1 deletion headers/private/app/LaunchDaemonDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@ namespace BPrivate {
#define B_LAUNCH_DAEMON_PORT_NAME "system:launch_daemon"


// message constants
// Message constants
enum {
B_GET_LAUNCH_DATA = 'lnda',
B_LAUNCH_TARGET = 'lntg',
B_LAUNCH_SESSION = 'lnse',
B_REGISTER_SESSION_DAEMON = 'lnrs',
B_REGISTER_LAUNCH_EVENT = 'lnre',
B_UNREGISTER_LAUNCH_EVENT = 'lnue',
B_NOTIFY_LAUNCH_EVENT = 'lnne',
};


Expand Down
9 changes: 9 additions & 0 deletions headers/private/app/LaunchRoster.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,21 @@ class BLaunchRoster {

status_t StartSession(const char* login);

status_t RegisterEvent(const BMessenger& source,
const char* name);
status_t UnregisterEvent(const BMessenger& source,
const char* name);
status_t NotifyEvent(const BMessenger& source,
const char* name);

class Private;

private:
friend class Private;

void _InitMessenger();
status_t _UpdateEvent(uint32 what,
const BMessenger& source, const char* name);

private:
BMessenger fMessenger;
Expand Down
51 changes: 51 additions & 0 deletions src/kits/app/LaunchRoster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,27 @@ BLaunchRoster::StartSession(const char* login)
}


status_t
BLaunchRoster::RegisterEvent(const BMessenger& source, const char* name)
{
return _UpdateEvent(B_REGISTER_LAUNCH_EVENT, source, name);
}


status_t
BLaunchRoster::UnregisterEvent(const BMessenger& source, const char* name)
{
return _UpdateEvent(B_UNREGISTER_LAUNCH_EVENT, source, name);
}


status_t
BLaunchRoster::NotifyEvent(const BMessenger& source, const char* name)
{
return _UpdateEvent(B_NOTIFY_LAUNCH_EVENT, source, name);
}


void
BLaunchRoster::_InitMessenger()
{
Expand All @@ -219,3 +240,33 @@ BLaunchRoster::_InitMessenger()
B_PREFERRED_TOKEN);
}
}


status_t
BLaunchRoster::_UpdateEvent(uint32 what, const BMessenger& source,
const char* name)
{
if (be_app == NULL || name == NULL || name[0] == '\0')
return B_BAD_VALUE;

BMessage request(what);
status_t status = request.AddInt32("user", getuid());
if (status == B_OK)
status = request.AddMessenger("source", source);
if (status == B_OK)
status = request.AddString("owner", be_app->Signature());
if (status == B_OK)
status = request.AddString("name", name);
if (status != B_OK)
return status;

// send the request
BMessage result;
status = fMessenger.SendMessage(&request, &result);

// evaluate the reply
if (status == B_OK)
status = result.what;

return status;
}
125 changes: 124 additions & 1 deletion src/servers/launch/Events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,26 @@ class DemandEvent : public Event {
};


class ExternalEvent : public Event {
public:
ExternalEvent(Event* parent, const char* name,
const BMessage& args);

const BString& Name() const;
bool Resolve();

virtual status_t Register(EventRegistrator& registrator) const;
virtual void Unregister(EventRegistrator& registrator) const;

virtual BString ToString() const;

private:
BString fName;
BStringList fArguments;
bool fResolved;
};


class FileCreatedEvent : public Event {
public:
FileCreatedEvent(Event* parent,
Expand Down Expand Up @@ -104,7 +124,7 @@ create_event(Event* parent, const char* name, const BMessenger* target,
if (strcmp(name, "file_created") == 0)
return new FileCreatedEvent(parent, args);

return NULL;
return new ExternalEvent(parent, name, args);
}


Expand Down Expand Up @@ -353,6 +373,62 @@ DemandEvent::ToString() const
}


// #pragma mark - External event


ExternalEvent::ExternalEvent(Event* parent, const char* name,
const BMessage& args)
:
Event(parent),
fName(name),
fResolved(false)
{
const char* argument;
for (int32 index = 0; args.FindString("args", index, &argument) == B_OK;
index++) {
fArguments.Add(argument);
}
}


const BString&
ExternalEvent::Name() const
{
return fName;
}


bool
ExternalEvent::Resolve()
{
if (fResolved)
return false;

fResolved = true;
return true;
}


status_t
ExternalEvent::Register(EventRegistrator& registrator) const
{
return B_OK;
}


void
ExternalEvent::Unregister(EventRegistrator& registrator) const
{
}


BString
ExternalEvent::ToString() const
{
return fName;
}


// #pragma mark - file_created


Expand Down Expand Up @@ -416,6 +492,53 @@ Events::AddOnDemand(Event* event)
}


/*static*/ bool
Events::ResolveRegisteredEvent(Event* event, const char* name)
{
if (event == NULL)
return false;

if (EventContainer* container = dynamic_cast<EventContainer*>(event)) {
for (int32 index = 0; index < container->Events().CountItems();
index++) {
Event* event = container->Events().ItemAt(index);
if (ExternalEvent* external = dynamic_cast<ExternalEvent*>(event)) {
if (external->Name() == name && external->Resolve())
return true;
} else if (dynamic_cast<EventContainer*>(event) != NULL) {
if (ResolveRegisteredEvent(event, name))
return true;
}
}
}
return false;
}


/*static*/ void
Events::TriggerRegisteredEvent(Event* event, const char* name)
{
if (event == NULL)
return;

if (EventContainer* container = dynamic_cast<EventContainer*>(event)) {
for (int32 index = 0; index < container->Events().CountItems();
index++) {
Event* event = container->Events().ItemAt(index);
if (ExternalEvent* external = dynamic_cast<ExternalEvent*>(event)) {
if (external->Name() == name) {
external->Trigger();
return;
}
} else if (dynamic_cast<EventContainer*>(event) != NULL) {
TriggerRegisteredEvent(event, name);
}
}
}
return;
}


/*static*/ bool
Events::TriggerDemand(Event* event)
{
Expand Down
4 changes: 4 additions & 0 deletions src/servers/launch/Events.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ class Events {
static Event* FromMessage(const BMessenger& target,
const BMessage& message);
static Event* AddOnDemand(Event* event);
static bool ResolveRegisteredEvent(Event* event,
const char* name);
static void TriggerRegisteredEvent(Event* event,
const char* name);
static bool TriggerDemand(Event* event);
};

Expand Down

0 comments on commit d94e9c9

Please sign in to comment.