xref: /haiku/src/servers/launch/Job.h (revision 59e6d9d2e2239c2d522cf820cac3a2e9c8a99c55)
18b8780bfSAxel Dörfler /*
28b8780bfSAxel Dörfler  * Copyright 2015, Axel Dörfler, axeld@pinc-software.de.
38b8780bfSAxel Dörfler  * Distributed under the terms of the MIT License.
48b8780bfSAxel Dörfler  */
58b8780bfSAxel Dörfler #ifndef JOB_H
68b8780bfSAxel Dörfler #define JOB_H
78b8780bfSAxel Dörfler 
88b8780bfSAxel Dörfler 
91e9c9871SAxel Dörfler #include "BaseJob.h"
108b8780bfSAxel Dörfler 
118b8780bfSAxel Dörfler #include <map>
128b8780bfSAxel Dörfler #include <set>
13ea19a80eSAxel Dörfler #include <vector>
148b8780bfSAxel Dörfler 
158b8780bfSAxel Dörfler #include <OS.h>
168b8780bfSAxel Dörfler #include <StringList.h>
178b8780bfSAxel Dörfler 
1814156a33SMichael Lotz #include <locks.h>
1914156a33SMichael Lotz 
208b8780bfSAxel Dörfler 
218b8780bfSAxel Dörfler using namespace BSupportKit;
228b8780bfSAxel Dörfler class BMessage;
235860caaeSAxel Dörfler class BMessenger;
248b8780bfSAxel Dörfler 
258b8780bfSAxel Dörfler class Finder;
26e2f83cbdSAxel Dörfler class Job;
278b8780bfSAxel Dörfler class Target;
288b8780bfSAxel Dörfler 
295cf6c0fdSMichael Lotz struct entry_ref;
305cf6c0fdSMichael Lotz 
318b8780bfSAxel Dörfler 
328b8780bfSAxel Dörfler typedef std::map<BString, BMessage> PortMap;
338b8780bfSAxel Dörfler 
348b8780bfSAxel Dörfler 
35e2f83cbdSAxel Dörfler class TeamRegistrator {
36e2f83cbdSAxel Dörfler public:
37e2f83cbdSAxel Dörfler 	virtual	void				RegisterTeam(Job* job) = 0;
38e2f83cbdSAxel Dörfler };
39e2f83cbdSAxel Dörfler 
40e2f83cbdSAxel Dörfler 
411e9c9871SAxel Dörfler class Job : public BaseJob {
428b8780bfSAxel Dörfler public:
438b8780bfSAxel Dörfler 								Job(const char* name);
448b8780bfSAxel Dörfler 								Job(const Job& other);
458b8780bfSAxel Dörfler 	virtual						~Job();
468b8780bfSAxel Dörfler 
47e2f83cbdSAxel Dörfler 			::TeamRegistrator*	TeamRegistrator() const;
48e2f83cbdSAxel Dörfler 			void				SetTeamRegistrator(
49e2f83cbdSAxel Dörfler 									::TeamRegistrator* registrator);
50e2f83cbdSAxel Dörfler 
518b8780bfSAxel Dörfler 			bool				IsEnabled() const;
528b8780bfSAxel Dörfler 			void				SetEnabled(bool enable);
538b8780bfSAxel Dörfler 
548b8780bfSAxel Dörfler 			bool				IsService() const;
558b8780bfSAxel Dörfler 			void				SetService(bool service);
568b8780bfSAxel Dörfler 
578b8780bfSAxel Dörfler 			bool				CreateDefaultPort() const;
588b8780bfSAxel Dörfler 			void				SetCreateDefaultPort(bool createPort);
598b8780bfSAxel Dörfler 
608b8780bfSAxel Dörfler 			void				AddPort(BMessage& data);
618b8780bfSAxel Dörfler 
628b8780bfSAxel Dörfler 			const BStringList&	Arguments() const;
638b8780bfSAxel Dörfler 			BStringList&		Arguments();
648b8780bfSAxel Dörfler 			void				AddArgument(const char* argument);
658b8780bfSAxel Dörfler 
668b8780bfSAxel Dörfler 			::Target*			Target() const;
678b8780bfSAxel Dörfler 			void				SetTarget(::Target* target);
688b8780bfSAxel Dörfler 
698b8780bfSAxel Dörfler 			const BStringList&	Requirements() const;
708b8780bfSAxel Dörfler 			BStringList&		Requirements();
718b8780bfSAxel Dörfler 			void				AddRequirement(const char* requirement);
728b8780bfSAxel Dörfler 
7359e6d9d2SAxel Dörfler 			const BStringList&	Pending() const;
7459e6d9d2SAxel Dörfler 			BStringList&		Pending();
7559e6d9d2SAxel Dörfler 			void				AddPending(const char* pending);
7659e6d9d2SAxel Dörfler 
772ca4f3f8SAxel Dörfler 	virtual	bool				CheckCondition(ConditionContext& context) const;
782ca4f3f8SAxel Dörfler 
798b8780bfSAxel Dörfler 			status_t			Init(const Finder& jobs,
808b8780bfSAxel Dörfler 									std::set<BString>& dependencies);
818b8780bfSAxel Dörfler 			status_t			InitCheck() const;
828b8780bfSAxel Dörfler 
838b8780bfSAxel Dörfler 			team_id				Team() const;
848b8780bfSAxel Dörfler 
858b8780bfSAxel Dörfler 			const PortMap&		Ports() const;
868b8780bfSAxel Dörfler 			port_id				Port(const char* name = NULL) const;
878b8780bfSAxel Dörfler 
8870708ef9SAxel Dörfler 			port_id				DefaultPort() const;
8970708ef9SAxel Dörfler 			void				SetDefaultPort(port_id port);
9070708ef9SAxel Dörfler 
918b8780bfSAxel Dörfler 			status_t			Launch();
928b8780bfSAxel Dörfler 			bool				IsLaunched() const;
937cd19b7eSAxel Dörfler 			bool				IsRunning() const;
94e2f83cbdSAxel Dörfler 			void				TeamDeleted();
95e2f83cbdSAxel Dörfler 			bool				CanBeLaunched() const;
968b8780bfSAxel Dörfler 
97*4ae4b3ffSAxel Dörfler 			bool				IsLaunching() const;
98*4ae4b3ffSAxel Dörfler 			void				SetLaunching(bool launching);
99*4ae4b3ffSAxel Dörfler 
10014156a33SMichael Lotz 			status_t			HandleGetLaunchData(BMessage* message);
1015860caaeSAxel Dörfler 			status_t			GetMessenger(BMessenger& messenger);
10214156a33SMichael Lotz 
1037cd19b7eSAxel Dörfler 	virtual	status_t			Run();
1047cd19b7eSAxel Dörfler 
1058b8780bfSAxel Dörfler protected:
1068b8780bfSAxel Dörfler 	virtual	status_t			Execute();
1078b8780bfSAxel Dörfler 
1088b8780bfSAxel Dörfler private:
1098b8780bfSAxel Dörfler 			Job&				operator=(const Job& other);
1108b8780bfSAxel Dörfler 			void				_DeletePorts();
1118b8780bfSAxel Dörfler 			status_t			_AddRequirement(BJob* dependency);
112ea19a80eSAxel Dörfler 			void				_AddStringList(std::vector<const char*>& array,
113ea19a80eSAxel Dörfler 									const BStringList& list);
1148b8780bfSAxel Dörfler 
11514156a33SMichael Lotz 			void				_SetLaunchStatus(status_t launchStatus);
11614156a33SMichael Lotz 
11714156a33SMichael Lotz 			status_t			_SendLaunchDataReply(BMessage* message);
11814156a33SMichael Lotz 			void				_SendPendingLaunchDataReplies();
11914156a33SMichael Lotz 
1205cf6c0fdSMichael Lotz 			status_t			_CreateAndTransferPorts();
1219e73b627SAxel Dörfler 			port_id				_CreateAndTransferPort(const char* name,
1229e73b627SAxel Dörfler 									int32 capacity);
1235cf6c0fdSMichael Lotz 
1245cf6c0fdSMichael Lotz 			status_t			_Launch(const char* signature, entry_ref* ref,
1255cf6c0fdSMichael Lotz 									int argCount, const char* const* args,
1265cf6c0fdSMichael Lotz 									const char** environment);
1275cf6c0fdSMichael Lotz 
1288b8780bfSAxel Dörfler private:
1298b8780bfSAxel Dörfler 			BStringList			fArguments;
1308b8780bfSAxel Dörfler 			BStringList			fRequirements;
1318b8780bfSAxel Dörfler 			bool				fEnabled;
1328b8780bfSAxel Dörfler 			bool				fService;
1338b8780bfSAxel Dörfler 			bool				fCreateDefaultPort;
134*4ae4b3ffSAxel Dörfler 			bool				fLaunching;
1358b8780bfSAxel Dörfler 			PortMap				fPortMap;
1368b8780bfSAxel Dörfler 			status_t			fInitStatus;
1378b8780bfSAxel Dörfler 			team_id				fTeam;
13870708ef9SAxel Dörfler 			port_id				fDefaultPort;
1399e73b627SAxel Dörfler 			uint32				fToken;
14014156a33SMichael Lotz 			status_t			fLaunchStatus;
14114156a33SMichael Lotz 			mutex				fLaunchStatusLock;
1428b8780bfSAxel Dörfler 			::Target*			fTarget;
1431e9c9871SAxel Dörfler 			::Condition*		fCondition;
14459e6d9d2SAxel Dörfler 			BStringList			fPendingJobs;
14514156a33SMichael Lotz 			BObjectList<BMessage>
14614156a33SMichael Lotz 								fPendingLaunchDataReplies;
147e2f83cbdSAxel Dörfler 			::TeamRegistrator*	fTeamRegistrator;
1488b8780bfSAxel Dörfler };
1498b8780bfSAxel Dörfler 
1508b8780bfSAxel Dörfler 
1518b8780bfSAxel Dörfler class Finder {
1528b8780bfSAxel Dörfler public:
1538b8780bfSAxel Dörfler 	virtual	Job*				FindJob(const char* name) const = 0;
1548b8780bfSAxel Dörfler 	virtual	Target*				FindTarget(const char* name) const = 0;
1558b8780bfSAxel Dörfler };
1568b8780bfSAxel Dörfler 
1578b8780bfSAxel Dörfler 
1588b8780bfSAxel Dörfler #endif // JOB_H
159