launch_daemon: Divided MessageReceived() into several methods.

* Was getting huge.
This commit is contained in:
Axel Dörfler
2015-07-22 20:45:11 +02:00
parent d54bb194d7
commit f2afa73344
+89 -48
View File
@@ -88,6 +88,11 @@ public:
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
private: private:
void _HandleGetLaunchData(BMessage* message);
void _HandleLaunchTarget(BMessage* message);
void _HandleLaunchSession(BMessage* message);
void _HandleRegisterSessionDaemon(BMessage* message);
uid_t _GetUserID(BMessage* message); uid_t _GetUserID(BMessage* message);
void _ReadPaths(const BStringList& paths); void _ReadPaths(const BStringList& paths);
@@ -281,28 +286,89 @@ LaunchDaemon::MessageReceived(BMessage* message)
{ {
switch (message->what) { switch (message->what) {
case B_GET_LAUNCH_DATA: case B_GET_LAUNCH_DATA:
_HandleGetLaunchData(message);
break;
case B_LAUNCH_TARGET:
_HandleLaunchTarget(message);
break;
case B_LAUNCH_SESSION:
_HandleLaunchSession(message);
break;
case B_REGISTER_SESSION_DAEMON:
_HandleRegisterSessionDaemon(message);
break;
case kMsgEventTriggered:
{ {
// An internal event has been triggered.
// Check if its job can be launched now.
const char* name = message->GetString("owner");
if (name == NULL)
break;
Job* job = FindJob(name);
if (job != NULL && job->EventHasTriggered()) {
_AddLaunchJob(job);
break;
}
Target* target = FindTarget(name);
if (target != NULL && target->EventHasTriggered()) {
_LaunchJobs(target);
break;
}
break;
}
default:
BServer::MessageReceived(message);
break;
}
}
void
LaunchDaemon::_HandleGetLaunchData(BMessage* message)
{
uid_t user = _GetUserID(message); uid_t user = _GetUserID(message);
if (user < 0) if (user < 0)
return; return;
BMessage reply((uint32)B_OK); BMessage reply((uint32)B_OK);
bool triggerJob = true;
Job* job = FindJob(get_leaf(message->GetString("name"))); Job* job = FindJob(get_leaf(message->GetString("name")));
if (job == NULL) { if (job == NULL) {
Session* session = FindSession(user); Session* session = FindSession(user);
if (session != NULL) { if (session != NULL) {
// Forward request to user launch_daemon // Forward request to user launch_daemon
if (session->Daemon().SendMessage(message) == B_OK) if (session->Daemon().SendMessage(message) == B_OK)
break; return;
} }
reply.what = B_NAME_NOT_FOUND; reply.what = B_NAME_NOT_FOUND;
} else if (!job->IsLaunched() && !job->CheckCondition(*this)) { } else if (!job->IsLaunched()) {
if (!job->CheckCondition(*this)) {
// The job exists, but cannot be started yet, as its // The job exists, but cannot be started yet, as its
// conditions are not met; don't make it available yet // conditions are not met; don't make it available yet
// TODO: we may not want to initialize jobs with conditions // TODO: we may not want to initialize jobs with conditions
// that aren't met yet // that aren't met yet
reply.what = B_NO_INIT; reply.what = B_NO_INIT;
} else if (job->Event() != NULL) {
if (!Events::TriggerDemand(job->Event())) {
// The job is not triggered by demand; we cannot start it now
reply.what = B_NO_INIT;
} else { } else {
// The job has already been triggered, don't trigger it
// again
triggerJob = false;
}
}
}
if (reply.what == B_OK) {
// If the job has not been launched yet, we'll pass on our // If the job has not been launched yet, we'll pass on our
// team here. The rationale behind this is that this team // team here. The rationale behind this is that this team
// will temporarily own the synchronous reply ports. // will temporarily own the synchronous reply ports.
@@ -320,17 +386,19 @@ LaunchDaemon::MessageReceived(BMessage* message)
iterator->second.GetInt32("port", -1)); iterator->second.GetInt32("port", -1));
} }
if (triggerJob)
_TriggerJob(job); _TriggerJob(job);
} }
message->SendReply(&reply); message->SendReply(&reply);
break; }
}
case B_LAUNCH_TARGET:
{ void
LaunchDaemon::_HandleLaunchTarget(BMessage* message)
{
uid_t user = _GetUserID(message); uid_t user = _GetUserID(message);
if (user < 0) if (user < 0)
break; return;
const char* name = message->GetString("target"); const char* name = message->GetString("target");
const char* baseName = message->GetString("base target"); const char* baseName = message->GetString("base target");
@@ -361,12 +429,12 @@ LaunchDaemon::MessageReceived(BMessage* message)
if (session != NULL) { if (session != NULL) {
// Forward request to user launch_daemon // Forward request to user launch_daemon
if (session->Daemon().SendMessage(message) == B_OK) if (session->Daemon().SendMessage(message) == B_OK)
break; return;
} }
BMessage reply(B_NAME_NOT_FOUND); BMessage reply(B_NAME_NOT_FOUND);
message->SendReply(&reply); message->SendReply(&reply);
break; return;
} }
BMessage data; BMessage data;
@@ -374,14 +442,15 @@ LaunchDaemon::MessageReceived(BMessage* message)
target->AddData(data.GetString("name"), data); target->AddData(data.GetString("name"), data);
_LaunchJobs(target); _LaunchJobs(target);
break; }
}
case B_LAUNCH_SESSION:
{ void
LaunchDaemon::_HandleLaunchSession(BMessage* message)
{
uid_t user = _GetUserID(message); uid_t user = _GetUserID(message);
if (user < 0) if (user < 0)
break; return;
status_t status = B_OK; status_t status = B_OK;
const char* login = message->GetString("login"); const char* login = message->GetString("login");
@@ -397,14 +466,15 @@ LaunchDaemon::MessageReceived(BMessage* message)
BMessage reply((uint32)status); BMessage reply((uint32)status);
message->SendReply(&reply); message->SendReply(&reply);
break; }
}
case B_REGISTER_SESSION_DAEMON:
{ void
LaunchDaemon::_HandleRegisterSessionDaemon(BMessage* message)
{
uid_t user = _GetUserID(message); uid_t user = _GetUserID(message);
if (user < 0) if (user < 0)
break; return;
status_t status = B_OK; status_t status = B_OK;
@@ -422,35 +492,6 @@ LaunchDaemon::MessageReceived(BMessage* message)
BMessage reply((uint32)status); BMessage reply((uint32)status);
message->SendReply(&reply); message->SendReply(&reply);
break;
}
case kMsgEventTriggered:
{
// An internal event has been triggered.
// Check if its job can be launched now.
const char* name = message->GetString("owner");
if (name == NULL)
break;
Job* job = FindJob(name);
if (job != NULL && job->EventHasTriggered()) {
_AddLaunchJob(job);
break;
}
Target* target = FindTarget(name);
if (target != NULL && target->EventHasTriggered()) {
_LaunchJobs(target);
break;
}
break;
}
default:
BServer::MessageReceived(message);
break;
}
} }