1/*
2 * Copyright 2002, Marcus Overhagen. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef NODE_MANAGER_H
6#define NODE_MANAGER_H
7
8
9#include <map>
10#include <vector>
11
12#include <Locker.h>
13
14#include "TStack.h"
15#include "DataExchange.h"
16
17
18class DefaultManager;
19class BufferManager;
20
21
22typedef std::map<team_id, int32> TeamCountMap;
23typedef std::vector<media_input> InputList;
24typedef std::vector<media_output> OutputList;
25typedef std::vector<live_node_info> LiveNodeList;
26
27
28struct registered_node {
29	media_node_id			node_id;
30	media_addon_id			add_on_id;
31	int32					flavor_id;
32	char					name[B_MEDIA_NAME_LENGTH];
33	uint64					kinds;
34	port_id					port;
35	team_id					creator;	// team that created the node
36	team_id					containing_team;
37	int32					ref_count;
38	TeamCountMap			team_ref_count;
39	InputList				input_list;
40	OutputList				output_list;
41};
42
43struct dormant_add_on_flavor_info {
44	media_addon_id			add_on_id;
45	int32					flavor_id;
46
47	int32					max_instances_count;
48	int32					instances_count;
49
50	TeamCountMap		 	team_instances_count;
51
52	bool					info_valid;
53	dormant_flavor_info		info;
54};
55
56
57class NodeManager : BLocker {
58public:
59								NodeManager();
60								~NodeManager();
61
62	// Management of system wide default nodes
63			status_t			SetDefaultNode(node_type type,
64									const media_node* node,
65									const dormant_node_info* info,
66									const media_input* input);
67			status_t			GetDefaultNode(node_type type,
68									media_node_id* _nodeID, char* inputName,
69									int32* _inputID);
70			status_t			RescanDefaultNodes();
71
72	// Management of live nodes
73			status_t			RegisterNode(media_addon_id addOnID,
74									int32 flavorID, const char* name,
75									uint64 kinds, port_id port, team_id team,
76									media_node_id* _nodeID);
77			status_t			UnregisterNode(media_node_id nodeID,
78									team_id team, media_addon_id* addOnID,
79									int32* _flavorID);
80			status_t			ReleaseNodeReference(media_node_id id,
81									team_id team);
82			status_t			ReleaseNodeAll(media_node_id id);
83			status_t			GetCloneForID(media_node_id id, team_id team,
84									media_node* node);
85			status_t			GetClone(node_type type, team_id team,
86									media_node* node, char* inputName,
87									int32* _id);
88			status_t			ReleaseNode(const media_node& node,
89									team_id team);
90			status_t			PublishInputs(const media_node& node,
91									const media_input* inputs, int32 count);
92			status_t			PublishOutputs(const media_node& node,
93									const media_output* outputs, int32 count);
94			status_t			FindNodeID(port_id port, media_node_id* _id);
95			status_t			GetLiveNodeInfo(const media_node& node,
96									live_node_info* liveInfo);
97			status_t			GetInstances(media_addon_id addOnID,
98									int32 flavorID, media_node_id* ids,
99									int32* _count, int32 maxCount);
100			status_t			GetLiveNodes(LiveNodeList& liveNodes,
101									int32 maxCount,
102									const media_format* inputFormat = NULL,
103									const media_format* outputFormat = NULL,
104									const char* name = NULL,
105									uint64 requireKinds = 0);
106			status_t			GetDormantNodeInfo(const media_node& node,
107									dormant_node_info* nodeInfo);
108			status_t			SetNodeCreator(media_node_id id,
109									team_id creator);
110
111	// Add media_node_id of all live nodes to the message
112	// int32 "media_node_id" (multiple items)
113			status_t			GetLiveNodes(BMessage* message);
114
115			void				RegisterAddOn(const entry_ref& ref,
116									media_addon_id* _newID);
117			void				UnregisterAddOn(media_addon_id id);
118
119			status_t			AddDormantFlavorInfo(
120									const dormant_flavor_info& flavorInfo);
121			void				InvalidateDormantFlavorInfo(media_addon_id id);
122			void				RemoveDormantFlavorInfo(media_addon_id id);
123			void				CleanupDormantFlavorInfos();
124
125			status_t			IncrementFlavorInstancesCount(
126									media_addon_id addOnID, int32 flavorID,
127									team_id team);
128			status_t			DecrementFlavorInstancesCount(
129									media_addon_id addOnID, int32 flavorID,
130									team_id team);
131
132			status_t			GetAddOnRef(media_addon_id addOnID,
133									entry_ref* ref);
134			status_t			GetDormantNodes(dormant_node_info* infos,
135									int32* _count, const media_format* hasInput,
136									const media_format* hasOutput,
137									const char* name, uint64 requireKinds,
138									uint64 denyKinds);
139
140			status_t			GetDormantFlavorInfoFor(media_addon_id addOnID,
141									 int32 flavorID,
142									 dormant_flavor_info* flavorInfo);
143
144			void				CleanupTeam(team_id team);
145
146			status_t			LoadState();
147			status_t			SaveState();
148
149			void				Dump();
150
151private:
152			status_t			_AcquireNodeReference(media_node_id id,
153									team_id team);
154
155private:
156			typedef std::map<media_addon_id, registered_node> NodeMap;
157			typedef std::vector<dormant_add_on_flavor_info> DormantFlavorList;
158			typedef std::map<media_addon_id, entry_ref> PathMap;
159
160			media_addon_id		fNextAddOnID;
161			media_node_id		fNextNodeID;
162
163			DormantFlavorList	fDormantFlavors;
164			PathMap				fPathMap;
165			NodeMap				fNodeMap;
166			DefaultManager*		fDefaultManager;
167};
168
169#endif	// NODE_MANAGER_H
170