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