1 /* 2 * Copyright 2016, Rene Gollent, rene@gollent.com. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef TARGET_HOST_H 6 #define TARGET_HOST_H 7 8 #include <Locker.h> 9 #include <OS.h> 10 #include <String.h> 11 12 #include <ObjectList.h> 13 #include <Referenceable.h> 14 #include <util/DoublyLinkedList.h> 15 16 17 class TeamInfo; 18 19 20 class TargetHost : public BReferenceable { 21 public: 22 class Listener; 23 public: 24 TargetHost(const BString& name); 25 virtual ~TargetHost(); 26 27 bool Lock() { return fLock.Lock(); } 28 void Unlock() { fLock.Unlock(); } 29 30 const BString& Name() const { return fName; } 31 32 void AddListener(Listener* listener); 33 void RemoveListener(Listener* listener); 34 35 int32 CountTeams() const; 36 status_t AddTeam(const team_info& info); 37 void RemoveTeam(team_id team); 38 void UpdateTeam(const team_info& info); 39 TeamInfo* TeamInfoAt(int32 index) const; 40 TeamInfo* TeamInfoByID(team_id team) const; 41 42 private: 43 typedef DoublyLinkedList<Listener> ListenerList; 44 typedef BObjectList<TeamInfo> TeamInfoList; 45 46 private: 47 static int _CompareTeams(const TeamInfo* a, 48 const TeamInfo* b); 49 static int _FindTeamByKey(const team_id* id, 50 const TeamInfo* info); 51 52 void _NotifyTeamAdded(TeamInfo* info); 53 void _NotifyTeamRemoved(team_id team); 54 void _NotifyTeamRenamed(TeamInfo* info); 55 56 private: 57 BString fName; 58 BLocker fLock; 59 ListenerList fListeners; 60 TeamInfoList fTeams; 61 }; 62 63 64 class TargetHost::Listener 65 : public DoublyLinkedListLinkImpl<TargetHost::Listener> { 66 public: 67 virtual ~Listener(); 68 69 virtual void TeamAdded(TeamInfo* info); 70 virtual void TeamRemoved(team_id team); 71 virtual void TeamRenamed(TeamInfo* info); 72 }; 73 74 #endif // TARGET_HOST_H 75