11480e5daSAxel Dörfler/*
2a77aa747SAxel Dörfler * Copyright 2015-2017 Haiku, Inc. All rights reserved.
31480e5daSAxel Dörfler * Distributed under the terms of the MIT License.
41480e5daSAxel Dörfler *
51480e5daSAxel Dörfler * Authors:
61480e5daSAxel Dörfler *		Axel D��rfler, axeld@pinc-software.de
71480e5daSAxel Dörfler */
81480e5daSAxel Dörfler
91480e5daSAxel Dörfler
101480e5daSAxel Dörfler#include <LaunchRoster.h>
111480e5daSAxel Dörfler
1243aec2c7SAxel Dörfler#include <Application.h>
13d482c7caSAxel Dörfler#include <String.h>
143282b758SAxel Dörfler#include <StringList.h>
15d482c7caSAxel Dörfler
169d69dc09SAxel Dörfler#include <launch.h>
171480e5daSAxel Dörfler#include <LaunchDaemonDefs.h>
18ac0a462fSAxel Dörfler#include <LaunchRosterPrivate.h>
191480e5daSAxel Dörfler#include <MessengerPrivate.h>
201480e5daSAxel Dörfler
211480e5daSAxel Dörfler
221480e5daSAxel Dörflerusing namespace BPrivate;
231480e5daSAxel Dörfler
241480e5daSAxel Dörfler
25ac0a462fSAxel DörflerBLaunchRoster::Private::Private(BLaunchRoster* roster)
26ac0a462fSAxel Dörfler	:
27ac0a462fSAxel Dörfler	fRoster(roster)
28ac0a462fSAxel Dörfler{
29ac0a462fSAxel Dörfler}
30ac0a462fSAxel Dörfler
31ac0a462fSAxel Dörfler
32ac0a462fSAxel DörflerBLaunchRoster::Private::Private(BLaunchRoster& roster)
33ac0a462fSAxel Dörfler	:
34ac0a462fSAxel Dörfler	fRoster(&roster)
35ac0a462fSAxel Dörfler{
36ac0a462fSAxel Dörfler}
37ac0a462fSAxel Dörfler
38ac0a462fSAxel Dörfler
39ac0a462fSAxel Dörflerstatus_t
40c086a183SAxel DörflerBLaunchRoster::Private::RegisterSessionDaemon(const BMessenger& daemon)
41ac0a462fSAxel Dörfler{
42c086a183SAxel Dörfler	BMessage request(B_REGISTER_SESSION_DAEMON);
43ac0a462fSAxel Dörfler	status_t status = request.AddInt32("user", getuid());
44ac0a462fSAxel Dörfler	if (status == B_OK)
45c086a183SAxel Dörfler		status = request.AddMessenger("daemon", daemon);
46ac0a462fSAxel Dörfler	if (status != B_OK)
47ac0a462fSAxel Dörfler		return status;
48ac0a462fSAxel Dörfler
49ac0a462fSAxel Dörfler	// send the request
50ac0a462fSAxel Dörfler	BMessage result;
51ac0a462fSAxel Dörfler	status = fRoster->fMessenger.SendMessage(&request, &result);
52ac0a462fSAxel Dörfler
53ac0a462fSAxel Dörfler	// evaluate the reply
54ac0a462fSAxel Dörfler	if (status == B_OK)
55ac0a462fSAxel Dörfler		status = result.what;
56ac0a462fSAxel Dörfler
57ac0a462fSAxel Dörfler	return status;
58ac0a462fSAxel Dörfler}
59ac0a462fSAxel Dörfler
60ac0a462fSAxel Dörfler
61ac0a462fSAxel Dörfler// #pragma mark -
62ac0a462fSAxel Dörfler
63ac0a462fSAxel Dörfler
641480e5daSAxel DörflerBLaunchRoster::BLaunchRoster()
651480e5daSAxel Dörfler{
661480e5daSAxel Dörfler	_InitMessenger();
671480e5daSAxel Dörfler}
681480e5daSAxel Dörfler
691480e5daSAxel Dörfler
701480e5daSAxel DörflerBLaunchRoster::~BLaunchRoster()
711480e5daSAxel Dörfler{
721480e5daSAxel Dörfler}
731480e5daSAxel Dörfler
741480e5daSAxel Dörfler
751480e5daSAxel Dörflerstatus_t
761480e5daSAxel DörflerBLaunchRoster::InitCheck() const
771480e5daSAxel Dörfler{
781480e5daSAxel Dörfler	return fMessenger.Team() >= 0 ? B_OK : B_ERROR;
791480e5daSAxel Dörfler}
801480e5daSAxel Dörfler
811480e5daSAxel Dörfler
8243aec2c7SAxel Dörflerstatus_t
8343aec2c7SAxel DörflerBLaunchRoster::GetData(BMessage& data)
8443aec2c7SAxel Dörfler{
8543aec2c7SAxel Dörfler	if (be_app == NULL)
8643aec2c7SAxel Dörfler		return B_BAD_VALUE;
8743aec2c7SAxel Dörfler
8843aec2c7SAxel Dörfler	return GetData(be_app->Signature(), data);
8943aec2c7SAxel Dörfler}
9043aec2c7SAxel Dörfler
9143aec2c7SAxel Dörfler
921480e5daSAxel Dörflerstatus_t
931480e5daSAxel DörflerBLaunchRoster::GetData(const char* signature, BMessage& data)
941480e5daSAxel Dörfler{
951480e5daSAxel Dörfler	if (signature == NULL || signature[0] == '\0')
961480e5daSAxel Dörfler		return B_BAD_VALUE;
971480e5daSAxel Dörfler
98d482c7caSAxel Dörfler	BMessage request(B_GET_LAUNCH_DATA);
991480e5daSAxel Dörfler	status_t status = request.AddString("name", signature);
100ac0a462fSAxel Dörfler	if (status == B_OK)
101ac0a462fSAxel Dörfler		status = request.AddInt32("user", getuid());
1021480e5daSAxel Dörfler	if (status != B_OK)
1031480e5daSAxel Dörfler		return status;
1041480e5daSAxel Dörfler
1055860caaeSAxel Dörfler	return _SendRequest(request, data);
1061480e5daSAxel Dörfler}
1071480e5daSAxel Dörfler
1081480e5daSAxel Dörfler
10943aec2c7SAxel Dörflerport_id
11043aec2c7SAxel DörflerBLaunchRoster::GetPort(const char* name)
11143aec2c7SAxel Dörfler{
11243aec2c7SAxel Dörfler	if (be_app == NULL)
11343aec2c7SAxel Dörfler		return B_BAD_VALUE;
11443aec2c7SAxel Dörfler
11543aec2c7SAxel Dörfler	return GetPort(be_app->Signature(), name);
11643aec2c7SAxel Dörfler}
11743aec2c7SAxel Dörfler
11843aec2c7SAxel Dörfler
119d482c7caSAxel Dörflerport_id
120d482c7caSAxel DörflerBLaunchRoster::GetPort(const char* signature, const char* name)
121d482c7caSAxel Dörfler{
122d482c7caSAxel Dörfler	BMessage data;
123ac0a462fSAxel Dörfler	status_t status = GetData(signature, data);
124d482c7caSAxel Dörfler	if (status == B_OK) {
125d482c7caSAxel Dörfler		BString fieldName;
12643aec2c7SAxel Dörfler		if (name != NULL)
12743aec2c7SAxel Dörfler			fieldName << name << "_";
12843aec2c7SAxel Dörfler		fieldName << "port";
12943aec2c7SAxel Dörfler
130d482c7caSAxel Dörfler		port_id port = data.GetInt32(fieldName.String(), B_NAME_NOT_FOUND);
131d482c7caSAxel Dörfler		if (port >= 0)
132d482c7caSAxel Dörfler			return port;
133d482c7caSAxel Dörfler	}
134d482c7caSAxel Dörfler
135d482c7caSAxel Dörfler	return -1;
136d482c7caSAxel Dörfler}
137d482c7caSAxel Dörfler
138d482c7caSAxel Dörfler
139c086a183SAxel Dörflerstatus_t
1404c67f79cSAxel DörflerBLaunchRoster::Target(const char* name, const BMessage& data,
1414c67f79cSAxel Dörfler	const char* baseName)
1424c67f79cSAxel Dörfler{
1434c67f79cSAxel Dörfler	return Target(name, &data, baseName);
1444c67f79cSAxel Dörfler}
1454c67f79cSAxel Dörfler
1464c67f79cSAxel Dörfler
1474c67f79cSAxel Dörflerstatus_t
1484c67f79cSAxel DörflerBLaunchRoster::Target(const char* name, const BMessage* data,
1494c67f79cSAxel Dörfler	const char* baseName)
150c086a183SAxel Dörfler{
151c086a183SAxel Dörfler	if (name == NULL)
152c086a183SAxel Dörfler		return B_BAD_VALUE;
153c086a183SAxel Dörfler
154c086a183SAxel Dörfler	BMessage request(B_LAUNCH_TARGET);
155c086a183SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
156c086a183SAxel Dörfler	if (status == B_OK)
157c086a183SAxel Dörfler		status = request.AddString("target", name);
1584c67f79cSAxel Dörfler	if (status == B_OK && data != NULL && !data->IsEmpty())
1594c67f79cSAxel Dörfler		status = request.AddMessage("data", data);
160c086a183SAxel Dörfler	if (status == B_OK && baseName != NULL)
161c086a183SAxel Dörfler		status = request.AddString("base target", baseName);
162c086a183SAxel Dörfler	if (status != B_OK)
163c086a183SAxel Dörfler		return status;
164c086a183SAxel Dörfler
1655860caaeSAxel Dörfler	return _SendRequest(request);
1665860caaeSAxel Dörfler}
167c086a183SAxel Dörfler
1685860caaeSAxel Dörfler
169852e09d6SAxel Dörflerstatus_t
170852e09d6SAxel DörflerBLaunchRoster::StopTarget(const char* name, bool force)
171852e09d6SAxel Dörfler{
172852e09d6SAxel Dörfler	if (name == NULL)
173852e09d6SAxel Dörfler		return B_BAD_VALUE;
174852e09d6SAxel Dörfler
175852e09d6SAxel Dörfler	BMessage request(B_STOP_LAUNCH_TARGET);
176852e09d6SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
177852e09d6SAxel Dörfler	if (status == B_OK)
178852e09d6SAxel Dörfler		status = request.AddString("target", name);
179852e09d6SAxel Dörfler	if (status == B_OK)
180852e09d6SAxel Dörfler		status = request.AddBool("force", force);
181852e09d6SAxel Dörfler	if (status != B_OK)
182852e09d6SAxel Dörfler		return status;
183852e09d6SAxel Dörfler
184852e09d6SAxel Dörfler	return _SendRequest(request);
185852e09d6SAxel Dörfler}
186852e09d6SAxel Dörfler
187852e09d6SAxel Dörfler
1885860caaeSAxel Dörflerstatus_t
1895860caaeSAxel DörflerBLaunchRoster::Start(const char* name)
1905860caaeSAxel Dörfler{
1915860caaeSAxel Dörfler	if (name == NULL)
1925860caaeSAxel Dörfler		return B_BAD_VALUE;
1935860caaeSAxel Dörfler
1945860caaeSAxel Dörfler	BMessage request(B_LAUNCH_JOB);
1955860caaeSAxel Dörfler	status_t status = request.AddInt32("user", getuid());
196c086a183SAxel Dörfler	if (status == B_OK)
1975860caaeSAxel Dörfler		status = request.AddString("name", name);
1985860caaeSAxel Dörfler	if (status != B_OK)
1995860caaeSAxel Dörfler		return status;
200c086a183SAxel Dörfler
2015860caaeSAxel Dörfler	return _SendRequest(request);
2025860caaeSAxel Dörfler}
2035860caaeSAxel Dörfler
2045860caaeSAxel Dörfler
2055860caaeSAxel Dörflerstatus_t
2065860caaeSAxel DörflerBLaunchRoster::Stop(const char* name, bool force)
2075860caaeSAxel Dörfler{
2085860caaeSAxel Dörfler	if (name == NULL)
2095860caaeSAxel Dörfler		return B_BAD_VALUE;
2105860caaeSAxel Dörfler
2115860caaeSAxel Dörfler	BMessage request(B_STOP_LAUNCH_JOB);
2125860caaeSAxel Dörfler	status_t status = request.AddInt32("user", getuid());
2135860caaeSAxel Dörfler	if (status == B_OK)
2145860caaeSAxel Dörfler		status = request.AddString("name", name);
2155860caaeSAxel Dörfler	if (status == B_OK)
2165860caaeSAxel Dörfler		status = request.AddBool("force", force);
2175860caaeSAxel Dörfler	if (status != B_OK)
2185860caaeSAxel Dörfler		return status;
2195860caaeSAxel Dörfler
2205860caaeSAxel Dörfler	return _SendRequest(request);
221c086a183SAxel Dörfler}
222c086a183SAxel Dörfler
223c086a183SAxel Dörfler
22490fd6af0SAxel Dörflerstatus_t
22590fd6af0SAxel DörflerBLaunchRoster::SetEnabled(const char* name, bool enable)
22690fd6af0SAxel Dörfler{
22790fd6af0SAxel Dörfler	if (name == NULL)
22890fd6af0SAxel Dörfler		return B_BAD_VALUE;
22990fd6af0SAxel Dörfler
23090fd6af0SAxel Dörfler	BMessage request(B_ENABLE_LAUNCH_JOB);
23190fd6af0SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
23290fd6af0SAxel Dörfler	if (status == B_OK)
23390fd6af0SAxel Dörfler		status = request.AddString("name", name);
23490fd6af0SAxel Dörfler	if (status == B_OK)
23590fd6af0SAxel Dörfler		status = request.AddBool("enable", enable);
23690fd6af0SAxel Dörfler	if (status != B_OK)
23790fd6af0SAxel Dörfler		return status;
23890fd6af0SAxel Dörfler
23990fd6af0SAxel Dörfler	return _SendRequest(request);
24090fd6af0SAxel Dörfler}
24190fd6af0SAxel Dörfler
24290fd6af0SAxel Dörfler
243ac0a462fSAxel Dörflerstatus_t
244560119c9SAxel DörflerBLaunchRoster::StartSession(const char* login)
245ac0a462fSAxel Dörfler{
246560119c9SAxel Dörfler	if (login == NULL)
247ac0a462fSAxel Dörfler		return B_BAD_VALUE;
248ac0a462fSAxel Dörfler
249ac0a462fSAxel Dörfler	BMessage request(B_LAUNCH_SESSION);
250ac0a462fSAxel Dörfler	status_t status = request.AddInt32("user", getuid());
251ac0a462fSAxel Dörfler	if (status == B_OK)
252ac0a462fSAxel Dörfler		status = request.AddString("login", login);
253ac0a462fSAxel Dörfler	if (status != B_OK)
254ac0a462fSAxel Dörfler		return status;
255ac0a462fSAxel Dörfler
2565860caaeSAxel Dörfler	return _SendRequest(request);
257ac0a462fSAxel Dörfler}
258ac0a462fSAxel Dörfler
259ac0a462fSAxel Dörfler
260d94e9c97SAxel Dörflerstatus_t
2617cd19b7eSAxel DörflerBLaunchRoster::RegisterEvent(const BMessenger& source, const char* name,
2627cd19b7eSAxel Dörfler	uint32 flags)
263d94e9c97SAxel Dörfler{
2647cd19b7eSAxel Dörfler	return _UpdateEvent(B_REGISTER_LAUNCH_EVENT, source, name, flags);
265d94e9c97SAxel Dörfler}
266d94e9c97SAxel Dörfler
267d94e9c97SAxel Dörfler
268d94e9c97SAxel Dörflerstatus_t
269d94e9c97SAxel DörflerBLaunchRoster::UnregisterEvent(const BMessenger& source, const char* name)
270d94e9c97SAxel Dörfler{
271d94e9c97SAxel Dörfler	return _UpdateEvent(B_UNREGISTER_LAUNCH_EVENT, source, name);
272d94e9c97SAxel Dörfler}
273d94e9c97SAxel Dörfler
274d94e9c97SAxel Dörfler
275d94e9c97SAxel Dörflerstatus_t
276d94e9c97SAxel DörflerBLaunchRoster::NotifyEvent(const BMessenger& source, const char* name)
277d94e9c97SAxel Dörfler{
278d94e9c97SAxel Dörfler	return _UpdateEvent(B_NOTIFY_LAUNCH_EVENT, source, name);
279d94e9c97SAxel Dörfler}
280d94e9c97SAxel Dörfler
281d94e9c97SAxel Dörfler
2822e17b650SAxel Dörflerstatus_t
2832e17b650SAxel DörflerBLaunchRoster::ResetStickyEvent(const BMessenger& source, const char* name)
2842e17b650SAxel Dörfler{
2852e17b650SAxel Dörfler	return _UpdateEvent(B_RESET_STICKY_LAUNCH_EVENT, source, name);
2862e17b650SAxel Dörfler}
2872e17b650SAxel Dörfler
2882e17b650SAxel Dörfler
2893282b758SAxel Dörflerstatus_t
2903282b758SAxel DörflerBLaunchRoster::GetTargets(BStringList& targets)
2913282b758SAxel Dörfler{
2923282b758SAxel Dörfler	BMessage request(B_GET_LAUNCH_TARGETS);
2933282b758SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
2943282b758SAxel Dörfler	if (status != B_OK)
2953282b758SAxel Dörfler		return status;
2963282b758SAxel Dörfler
2973282b758SAxel Dörfler	// send the request
2983282b758SAxel Dörfler	BMessage result;
2995860caaeSAxel Dörfler	status = _SendRequest(request, result);
3003282b758SAxel Dörfler	if (status == B_OK)
3013282b758SAxel Dörfler		status = result.FindStrings("target", &targets);
3023282b758SAxel Dörfler
3033282b758SAxel Dörfler	return status;
3043282b758SAxel Dörfler}
3053282b758SAxel Dörfler
3063282b758SAxel Dörfler
3073282b758SAxel Dörflerstatus_t
3083282b758SAxel DörflerBLaunchRoster::GetTargetInfo(const char* name, BMessage& info)
3093282b758SAxel Dörfler{
3103282b758SAxel Dörfler	return _GetInfo(B_GET_LAUNCH_TARGET_INFO, name, info);
3113282b758SAxel Dörfler}
3123282b758SAxel Dörfler
3133282b758SAxel Dörfler
3143282b758SAxel Dörflerstatus_t
3153282b758SAxel DörflerBLaunchRoster::GetJobs(const char* target, BStringList& jobs)
3163282b758SAxel Dörfler{
3173282b758SAxel Dörfler	BMessage request(B_GET_LAUNCH_JOBS);
3183282b758SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
3193282b758SAxel Dörfler	if (status == B_OK && target != NULL)
3203282b758SAxel Dörfler		status = request.AddString("target", target);
3213282b758SAxel Dörfler	if (status != B_OK)
3223282b758SAxel Dörfler		return status;
3233282b758SAxel Dörfler
3243282b758SAxel Dörfler	// send the request
3253282b758SAxel Dörfler	BMessage result;
3265860caaeSAxel Dörfler	status = _SendRequest(request, result);
3273282b758SAxel Dörfler	if (status == B_OK)
3283282b758SAxel Dörfler		status = result.FindStrings("job", &jobs);
3293282b758SAxel Dörfler
3303282b758SAxel Dörfler	return status;
3313282b758SAxel Dörfler}
3323282b758SAxel Dörfler
3333282b758SAxel Dörfler
3343282b758SAxel Dörflerstatus_t
3353282b758SAxel DörflerBLaunchRoster::GetJobInfo(const char* name, BMessage& info)
3363282b758SAxel Dörfler{
3373282b758SAxel Dörfler	return _GetInfo(B_GET_LAUNCH_JOB_INFO, name, info);
3383282b758SAxel Dörfler}
3393282b758SAxel Dörfler
3403282b758SAxel Dörfler
341a77aa747SAxel Dörflerstatus_t
342a77aa747SAxel DörflerBLaunchRoster::GetLog(BMessage& info)
343a77aa747SAxel Dörfler{
344a77aa747SAxel Dörfler	return _GetLog(NULL, info);
345a77aa747SAxel Dörfler}
346a77aa747SAxel Dörfler
347a77aa747SAxel Dörfler
348a77aa747SAxel Dörflerstatus_t
349a77aa747SAxel DörflerBLaunchRoster::GetLog(const BMessage& filter, BMessage& info)
350a77aa747SAxel Dörfler{
351a77aa747SAxel Dörfler	return _GetLog(&filter, info);
352a77aa747SAxel Dörfler}
353a77aa747SAxel Dörfler
354a77aa747SAxel Dörfler
3551480e5daSAxel Dörflervoid
3561480e5daSAxel DörflerBLaunchRoster::_InitMessenger()
3571480e5daSAxel Dörfler{
358e96835a9SAxel Dörfler#ifdef TEST_MODE
359e96835a9SAxel Dörfler	port_id daemonPort = find_port(B_LAUNCH_DAEMON_PORT_NAME);
360e96835a9SAxel Dörfler#else
3611480e5daSAxel Dörfler	// find the launch_daemon port
3629d69dc09SAxel Dörfler	port_id daemonPort = BPrivate::get_launch_daemon_port();
363e96835a9SAxel Dörfler#endif
3641480e5daSAxel Dörfler	port_info info;
3651480e5daSAxel Dörfler	if (daemonPort >= 0 && get_port_info(daemonPort, &info) == B_OK) {
3661480e5daSAxel Dörfler		BMessenger::Private(fMessenger).SetTo(info.team, daemonPort,
3671480e5daSAxel Dörfler			B_PREFERRED_TOKEN);
3681480e5daSAxel Dörfler	}
3691480e5daSAxel Dörfler}
370d94e9c97SAxel Dörfler
371d94e9c97SAxel Dörfler
3725860caaeSAxel Dörflerstatus_t
3735860caaeSAxel DörflerBLaunchRoster::_SendRequest(BMessage& request)
3745860caaeSAxel Dörfler{
3755860caaeSAxel Dörfler	BMessage result;
3765860caaeSAxel Dörfler	return _SendRequest(request, result);
3775860caaeSAxel Dörfler}
3785860caaeSAxel Dörfler
3795860caaeSAxel Dörfler
3805860caaeSAxel Dörflerstatus_t
3815860caaeSAxel DörflerBLaunchRoster::_SendRequest(BMessage& request, BMessage& result)
3825860caaeSAxel Dörfler{
3835860caaeSAxel Dörfler	// Send the request, and evaluate the reply
3845860caaeSAxel Dörfler	status_t status = fMessenger.SendMessage(&request, &result);
3855860caaeSAxel Dörfler	if (status == B_OK)
3865860caaeSAxel Dörfler		status = result.what;
3875860caaeSAxel Dörfler
3885860caaeSAxel Dörfler	return status;
3895860caaeSAxel Dörfler}
3905860caaeSAxel Dörfler
3915860caaeSAxel Dörfler
392d94e9c97SAxel Dörflerstatus_t
393d94e9c97SAxel DörflerBLaunchRoster::_UpdateEvent(uint32 what, const BMessenger& source,
3947cd19b7eSAxel Dörfler	const char* name, uint32 flags)
395d94e9c97SAxel Dörfler{
396d94e9c97SAxel Dörfler	if (be_app == NULL || name == NULL || name[0] == '\0')
397d94e9c97SAxel Dörfler		return B_BAD_VALUE;
398d94e9c97SAxel Dörfler
399d94e9c97SAxel Dörfler	BMessage request(what);
400d94e9c97SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
401d94e9c97SAxel Dörfler	if (status == B_OK)
402d94e9c97SAxel Dörfler		status = request.AddMessenger("source", source);
403d94e9c97SAxel Dörfler	if (status == B_OK)
404d94e9c97SAxel Dörfler		status = request.AddString("owner", be_app->Signature());
405d94e9c97SAxel Dörfler	if (status == B_OK)
406d94e9c97SAxel Dörfler		status = request.AddString("name", name);
4077cd19b7eSAxel Dörfler	if (status == B_OK && flags != 0)
4087cd19b7eSAxel Dörfler		status = request.AddUInt32("flags", flags);
409d94e9c97SAxel Dörfler	if (status != B_OK)
410d94e9c97SAxel Dörfler		return status;
411d94e9c97SAxel Dörfler
4125860caaeSAxel Dörfler	return _SendRequest(request);
413d94e9c97SAxel Dörfler}
4143282b758SAxel Dörfler
4153282b758SAxel Dörfler
4163282b758SAxel Dörflerstatus_t
4173282b758SAxel DörflerBLaunchRoster::_GetInfo(uint32 what, const char* name, BMessage& info)
4183282b758SAxel Dörfler{
4193282b758SAxel Dörfler	if (name == NULL || name[0] == '\0')
4203282b758SAxel Dörfler		return B_BAD_VALUE;
4213282b758SAxel Dörfler
4223282b758SAxel Dörfler	BMessage request(what);
4233282b758SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
4243282b758SAxel Dörfler	if (status == B_OK)
4253282b758SAxel Dörfler		status = request.AddString("name", name);
4263282b758SAxel Dörfler	if (status != B_OK)
4273282b758SAxel Dörfler		return status;
4283282b758SAxel Dörfler
4295860caaeSAxel Dörfler	return _SendRequest(request, info);
4303282b758SAxel Dörfler}
431a77aa747SAxel Dörfler
432a77aa747SAxel Dörfler
433a77aa747SAxel Dörflerstatus_t
434a77aa747SAxel DörflerBLaunchRoster::_GetLog(const BMessage* filter, BMessage& info)
435a77aa747SAxel Dörfler{
436a77aa747SAxel Dörfler	BMessage request(B_GET_LAUNCH_LOG);
437a77aa747SAxel Dörfler	status_t status = request.AddInt32("user", getuid());
438a77aa747SAxel Dörfler	if (status == B_OK && filter != NULL)
439a77aa747SAxel Dörfler		status = request.AddMessage("filter", filter);
440a77aa747SAxel Dörfler	if (status != B_OK)
441a77aa747SAxel Dörfler		return status;
442a77aa747SAxel Dörfler
443a77aa747SAxel Dörfler	return _SendRequest(request, info);
444a77aa747SAxel Dörfler}
445