xref: /haiku/src/servers/launch/Job.h (revision a77aa747eaf779898d401614a11b98fe58dddf35)
18b8780bfSAxel Dörfler /*
2*a77aa747SAxel Dörfler  * Copyright 2015-2018, 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 
356d7b8a30SAxel Dörfler class TeamListener {
36e2f83cbdSAxel Dörfler public:
37*a77aa747SAxel Dörfler 	virtual	void				TeamLaunched(Job* job, status_t status) = 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 
476d7b8a30SAxel Dörfler 			::TeamListener*		TeamListener() const;
486d7b8a30SAxel Dörfler 			void				SetTeamListener(::TeamListener* listener);
49e2f83cbdSAxel Dörfler 
508b8780bfSAxel Dörfler 			bool				IsEnabled() const;
518b8780bfSAxel Dörfler 			void				SetEnabled(bool enable);
528b8780bfSAxel Dörfler 
538b8780bfSAxel Dörfler 			bool				IsService() const;
548b8780bfSAxel Dörfler 			void				SetService(bool service);
558b8780bfSAxel Dörfler 
568b8780bfSAxel Dörfler 			bool				CreateDefaultPort() const;
578b8780bfSAxel Dörfler 			void				SetCreateDefaultPort(bool createPort);
588b8780bfSAxel Dörfler 
598b8780bfSAxel Dörfler 			void				AddPort(BMessage& data);
608b8780bfSAxel Dörfler 
618b8780bfSAxel Dörfler 			const BStringList&	Arguments() const;
628b8780bfSAxel Dörfler 			BStringList&		Arguments();
638b8780bfSAxel Dörfler 			void				AddArgument(const char* argument);
648b8780bfSAxel Dörfler 
658b8780bfSAxel Dörfler 			::Target*			Target() const;
668b8780bfSAxel Dörfler 			void				SetTarget(::Target* target);
678b8780bfSAxel Dörfler 
688b8780bfSAxel Dörfler 			const BStringList&	Requirements() const;
698b8780bfSAxel Dörfler 			BStringList&		Requirements();
708b8780bfSAxel Dörfler 			void				AddRequirement(const char* requirement);
718b8780bfSAxel Dörfler 
7259e6d9d2SAxel Dörfler 			const BStringList&	Pending() const;
7359e6d9d2SAxel Dörfler 			BStringList&		Pending();
7459e6d9d2SAxel Dörfler 			void				AddPending(const char* pending);
7559e6d9d2SAxel Dörfler 
762ca4f3f8SAxel Dörfler 	virtual	bool				CheckCondition(ConditionContext& context) const;
772ca4f3f8SAxel Dörfler 
788b8780bfSAxel Dörfler 			status_t			Init(const Finder& jobs,
798b8780bfSAxel Dörfler 									std::set<BString>& dependencies);
808b8780bfSAxel Dörfler 			status_t			InitCheck() const;
818b8780bfSAxel Dörfler 
828b8780bfSAxel Dörfler 			team_id				Team() const;
838b8780bfSAxel Dörfler 
848b8780bfSAxel Dörfler 			const PortMap&		Ports() const;
858b8780bfSAxel Dörfler 			port_id				Port(const char* name = NULL) const;
868b8780bfSAxel Dörfler 
8770708ef9SAxel Dörfler 			port_id				DefaultPort() const;
8870708ef9SAxel Dörfler 			void				SetDefaultPort(port_id port);
8970708ef9SAxel Dörfler 
908b8780bfSAxel Dörfler 			status_t			Launch();
918b8780bfSAxel Dörfler 			bool				IsLaunched() const;
927cd19b7eSAxel Dörfler 			bool				IsRunning() const;
93e2f83cbdSAxel Dörfler 			void				TeamDeleted();
94e2f83cbdSAxel Dörfler 			bool				CanBeLaunched() const;
958b8780bfSAxel Dörfler 
964ae4b3ffSAxel Dörfler 			bool				IsLaunching() const;
974ae4b3ffSAxel Dörfler 			void				SetLaunching(bool launching);
984ae4b3ffSAxel Dörfler 
9914156a33SMichael Lotz 			status_t			HandleGetLaunchData(BMessage* message);
1005860caaeSAxel Dörfler 			status_t			GetMessenger(BMessenger& messenger);
10114156a33SMichael Lotz 
1027cd19b7eSAxel Dörfler 	virtual	status_t			Run();
1037cd19b7eSAxel Dörfler 
1048b8780bfSAxel Dörfler protected:
1058b8780bfSAxel Dörfler 	virtual	status_t			Execute();
1068b8780bfSAxel Dörfler 
1078b8780bfSAxel Dörfler private:
1088b8780bfSAxel Dörfler 			Job&				operator=(const Job& other);
1098b8780bfSAxel Dörfler 			void				_DeletePorts();
1108b8780bfSAxel Dörfler 			status_t			_AddRequirement(BJob* dependency);
111ea19a80eSAxel Dörfler 			void				_AddStringList(std::vector<const char*>& array,
112ea19a80eSAxel Dörfler 									const BStringList& list);
1138b8780bfSAxel Dörfler 
11414156a33SMichael Lotz 			void				_SetLaunchStatus(status_t launchStatus);
11514156a33SMichael Lotz 
11614156a33SMichael Lotz 			status_t			_SendLaunchDataReply(BMessage* message);
11714156a33SMichael Lotz 			void				_SendPendingLaunchDataReplies();
11814156a33SMichael Lotz 
1195cf6c0fdSMichael Lotz 			status_t			_CreateAndTransferPorts();
1209e73b627SAxel Dörfler 			port_id				_CreateAndTransferPort(const char* name,
1219e73b627SAxel Dörfler 									int32 capacity);
1225cf6c0fdSMichael Lotz 
1235cf6c0fdSMichael Lotz 			status_t			_Launch(const char* signature, entry_ref* ref,
1245cf6c0fdSMichael Lotz 									int argCount, const char* const* args,
1255cf6c0fdSMichael Lotz 									const char** environment);
1265cf6c0fdSMichael Lotz 
1278b8780bfSAxel Dörfler private:
1288b8780bfSAxel Dörfler 			BStringList			fArguments;
1298b8780bfSAxel Dörfler 			BStringList			fRequirements;
1308b8780bfSAxel Dörfler 			bool				fEnabled;
1318b8780bfSAxel Dörfler 			bool				fService;
1328b8780bfSAxel Dörfler 			bool				fCreateDefaultPort;
1334ae4b3ffSAxel Dörfler 			bool				fLaunching;
1348b8780bfSAxel Dörfler 			PortMap				fPortMap;
1358b8780bfSAxel Dörfler 			status_t			fInitStatus;
1368b8780bfSAxel Dörfler 			team_id				fTeam;
13770708ef9SAxel Dörfler 			port_id				fDefaultPort;
1389e73b627SAxel Dörfler 			uint32				fToken;
13914156a33SMichael Lotz 			status_t			fLaunchStatus;
14014156a33SMichael Lotz 			mutex				fLaunchStatusLock;
1418b8780bfSAxel Dörfler 			::Target*			fTarget;
1421e9c9871SAxel Dörfler 			::Condition*		fCondition;
14359e6d9d2SAxel Dörfler 			BStringList			fPendingJobs;
14414156a33SMichael Lotz 			BObjectList<BMessage>
14514156a33SMichael Lotz 								fPendingLaunchDataReplies;
1466d7b8a30SAxel Dörfler 			::TeamListener*		fTeamListener;
1478b8780bfSAxel Dörfler };
1488b8780bfSAxel Dörfler 
1498b8780bfSAxel Dörfler 
1508b8780bfSAxel Dörfler class Finder {
1518b8780bfSAxel Dörfler public:
1528b8780bfSAxel Dörfler 	virtual	Job*				FindJob(const char* name) const = 0;
1538b8780bfSAxel Dörfler 	virtual	Target*				FindTarget(const char* name) const = 0;
1548b8780bfSAxel Dörfler };
1558b8780bfSAxel Dörfler 
1568b8780bfSAxel Dörfler 
1578b8780bfSAxel Dörfler #endif // JOB_H
158