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