- added version announcement to base library
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTComponentHandler.h
1 // @(#) $Id$
2
3 #ifndef ALIHLTCOMPONENTHANDLER_H
4 #define ALIHLTCOMPONENTHANDLER_H
5 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6  * See cxx source for full Copyright notice                               */
7
8 /** @file   AliHLTComponentHandler.h
9     @author Matthias Richter, Timm Steinbeck
10     @date   
11     @brief  Global handling of HLT processing components
12     @note   The handler is part of the interface and both used in the
13             Online (PubSub) and Offline (AliRoot) context.
14                                                                           */
15    
16
17 #include "TObject.h"
18 #include "AliHLTDataTypes.h"
19 #include "AliHLTLogging.h"
20
21 class AliHLTComponent;
22 struct AliHLTComponentEnvironment;
23 struct AliHLTComponent_DataType;
24
25 typedef void* AliHLTLibHandle;
26
27 /**
28  * @class AliHLTComponentHandler
29  * The component handler controls all the processing components available in
30  * the system. It also controls the component shared libraries.
31  * @ingroup alihlt_component
32  */
33 class AliHLTComponentHandler : public AliHLTLogging {
34  public:
35   /** standard constructor */
36   AliHLTComponentHandler();
37   /** destructor */
38   virtual ~AliHLTComponentHandler();
39
40   /**
41    * Set the environment for the HLT framework.
42    * The environment mainly consists of function pointers for the integration
43    * of the HLT framework into a system like the PubSub online system or
44    * AliRoot offline system.
45    * @param pEnv    pointer to @ref AliHLTComponentEnvironment structure
46    * @return none
47    */
48   void SetEnvironment(AliHLTComponentEnvironment* pEnv);
49
50   /**
51    * Load a component shared library.
52    * The component library needs to be loaded from the ComponentHanler in order
53    * to automatically register all components in the library.
54    * Registration is done by passing a sample object of the component to the
55    * handler. The object has to be valid during the whole runtime and should
56    * thus be a global object which is ONLY used for the purpose of registration.
57    * This also ensures automatically registration at library load time.
58    * @param libraryPath  const char string containing the library name/path
59    * @return 0 if succeeded, neg. error code if failed
60    */
61   int LoadLibrary( const char* libraryPath );
62
63   /**
64    * Unload a component shared library.
65    * All components will be de-registered.
66    * @param libraryPath  library name as specified to @ref LoadLibrary
67    * @return 0 if succeeded, neg. error code if failed
68    */
69   int UnloadLibrary( const char* libraryPath );
70
71   /**
72    * Schedule a component for registration.
73    * Full registration will be done after successfull loading of the shared
74    * library.
75    * @param pSample  a sample object of the component
76    * @return neg. error code if failed
77    */
78   int ScheduleRegister(AliHLTComponent* pSample );
79
80   /**
81    * Register a component.
82    * Registration is done by passing a sample object of the component to the
83    * handler. The object has to be valid during the whole runtime and should
84    * thus be a global object which is ONLY used for the purpose of registration.
85    * @param pSample  a sample object of the component
86    * @return neg. error code if failed
87    */
88   int RegisterComponent(AliHLTComponent* pSample );
89
90   /**
91    * Deregister a component.
92    * @param componentID   ID of the component
93    * @return neg. error code if failed
94    */
95   int DeregisterComponent( const char* componentID );
96
97   /**
98    * Find the ID of a component with the given output data.
99    * @param dtype     data type descriptor
100    * @param prevType  can be used to iterate if there are multiple components
101    *                  with the same output data type.
102    * @return component id
103    */
104   //const char* FindComponentType( AliHLTComponent_DataType dtype,
105   //                               const char* prevType = NULL )
106   //  { return NULL;}
107
108   /**
109    * Create a component of the given name (ID).
110    * @param componentID  ID of the component to create
111    * @param pEnv         environment for the component
112    * @param argc         number of arguments in @ref argv
113    * @param argv         argument array like in main()
114    * @param component    reference to receive the create component instance
115    * @return component pointer in @ref component, neg. error code if failed
116    */
117   int CreateComponent( const char* componentID, void* pEnv, 
118                        int argc, const char** argv, AliHLTComponent*& component );
119
120   /**
121    * Create a component of the given name (ID).
122    * Introduced for backward compatibility.
123    * @param componentID  ID of the component to create
124    * @param pEnv         environment for the component
125    * @param component    reference to receive the create component instance
126    * @return component pointer in @ref component, neg. error code if failed
127    */
128   int CreateComponent( const char* componentID, void* pEnv, 
129                        AliHLTComponent*& component ) 
130     {
131     return CreateComponent( componentID, pEnv, 0, NULL, component );
132     }
133
134   /**
135    * Print registered components to stdout.
136    * @return none
137    */
138   void List();
139
140   /**
141    * Announce version and compilation info of the base library.
142    */
143   int AnnounceVersion();
144
145  protected:
146
147  private:
148   /**
149    * Find a component.
150    * @param componentID  ID of the component to find
151    * @return index, neg. error code if failed
152    */
153   int FindComponentIndex(const char* componentID);
154
155   /**
156    * Find a component.
157    * @param componentID  ID of the component to find
158    * @return descriptor
159    */
160   AliHLTComponent* FindComponent(const char* componentID);
161
162   /**
163    * Insert component to the list
164    * @param pSample      sample object of the component
165    * @return neg. error code if failed
166    */
167   int InsertComponent(AliHLTComponent* pSample);
168
169   /**
170    * Close all libraries.
171    * @return neg. error code if failed
172    */
173   int UnloadLibraries();
174
175   /** list of registered components */
176   vector<AliHLTComponent*> fComponentList;
177   /** list of scheduled components */
178   vector<AliHLTComponent*> fScheduleList;
179   /** list of libraries */
180   vector<AliHLTLibHandle> fLibraryList;
181   /** running environment for the component */
182   AliHLTComponentEnvironment fEnvironment;
183
184   ClassDef(AliHLTComponentHandler, 0);
185
186 };
187 #endif
188