launch_daemon: Divided MessageReceived() into several methods.
* Was getting huge.
This commit is contained in:
@@ -88,6 +88,11 @@ public:
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
|
||||
private:
|
||||
void _HandleGetLaunchData(BMessage* message);
|
||||
void _HandleLaunchTarget(BMessage* message);
|
||||
void _HandleLaunchSession(BMessage* message);
|
||||
void _HandleRegisterSessionDaemon(BMessage* message);
|
||||
|
||||
uid_t _GetUserID(BMessage* message);
|
||||
|
||||
void _ReadPaths(const BStringList& paths);
|
||||
@@ -281,28 +286,89 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
{
|
||||
switch (message->what) {
|
||||
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);
|
||||
if (user < 0)
|
||||
return;
|
||||
|
||||
BMessage reply((uint32)B_OK);
|
||||
bool triggerJob = true;
|
||||
|
||||
Job* job = FindJob(get_leaf(message->GetString("name")));
|
||||
if (job == NULL) {
|
||||
Session* session = FindSession(user);
|
||||
if (session != NULL) {
|
||||
// Forward request to user launch_daemon
|
||||
if (session->Daemon().SendMessage(message) == B_OK)
|
||||
break;
|
||||
return;
|
||||
}
|
||||
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
|
||||
// conditions are not met; don't make it available yet
|
||||
// TODO: we may not want to initialize jobs with conditions
|
||||
// that aren't met yet
|
||||
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 {
|
||||
// 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
|
||||
// team here. The rationale behind this is that this team
|
||||
// will temporarily own the synchronous reply ports.
|
||||
@@ -320,17 +386,19 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
iterator->second.GetInt32("port", -1));
|
||||
}
|
||||
|
||||
if (triggerJob)
|
||||
_TriggerJob(job);
|
||||
}
|
||||
message->SendReply(&reply);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case B_LAUNCH_TARGET:
|
||||
{
|
||||
|
||||
void
|
||||
LaunchDaemon::_HandleLaunchTarget(BMessage* message)
|
||||
{
|
||||
uid_t user = _GetUserID(message);
|
||||
if (user < 0)
|
||||
break;
|
||||
return;
|
||||
|
||||
const char* name = message->GetString("target");
|
||||
const char* baseName = message->GetString("base target");
|
||||
@@ -361,12 +429,12 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
if (session != NULL) {
|
||||
// Forward request to user launch_daemon
|
||||
if (session->Daemon().SendMessage(message) == B_OK)
|
||||
break;
|
||||
return;
|
||||
}
|
||||
|
||||
BMessage reply(B_NAME_NOT_FOUND);
|
||||
message->SendReply(&reply);
|
||||
break;
|
||||
return;
|
||||
}
|
||||
|
||||
BMessage data;
|
||||
@@ -374,14 +442,15 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
target->AddData(data.GetString("name"), data);
|
||||
|
||||
_LaunchJobs(target);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case B_LAUNCH_SESSION:
|
||||
{
|
||||
|
||||
void
|
||||
LaunchDaemon::_HandleLaunchSession(BMessage* message)
|
||||
{
|
||||
uid_t user = _GetUserID(message);
|
||||
if (user < 0)
|
||||
break;
|
||||
return;
|
||||
|
||||
status_t status = B_OK;
|
||||
const char* login = message->GetString("login");
|
||||
@@ -397,14 +466,15 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
|
||||
BMessage reply((uint32)status);
|
||||
message->SendReply(&reply);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case B_REGISTER_SESSION_DAEMON:
|
||||
{
|
||||
|
||||
void
|
||||
LaunchDaemon::_HandleRegisterSessionDaemon(BMessage* message)
|
||||
{
|
||||
uid_t user = _GetUserID(message);
|
||||
if (user < 0)
|
||||
break;
|
||||
return;
|
||||
|
||||
status_t status = B_OK;
|
||||
|
||||
@@ -422,35 +492,6 @@ LaunchDaemon::MessageReceived(BMessage* message)
|
||||
|
||||
BMessage reply((uint32)status);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user