ROOT logo
// $Id$

/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/** @file   AliHLTModuleAgent.cxx
    @author Matthias Richter
    @date   
    @brief  Agent helper class for component libraries.
    @note   The class is used in Offline (AliRoot) context
*/

// see header file for class documentation
// or
// refer to README to build package
// or
// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt

#include "AliHLTModuleAgent.h"
#include "AliHLTOUTHandler.h"

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTModuleAgent)

AliHLTModuleAgent::AliHLTModuleAgent(const char* id)
  :
  fpNext(NULL),
  fpComponentHandler(NULL),
  fModuleId(id)
{
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
  Register(this);
}

const char* AliHLTModuleAgent::GetQAPlugins() const
{
  // default implementation, childs can overload
  return "";
}

const AliHLTModuleAgent::AliHLTOUTHandlerDesc AliHLTModuleAgent::fgkVoidHandlerDesc;

AliHLTModuleAgent::~AliHLTModuleAgent()
{
  // see header file for function documentation
  Unregister(this);
}

const char* AliHLTModuleAgent::GetModuleId() const
{
  // see header file for function documentation
  return fModuleId.Data();
}

void AliHLTModuleAgent::PrintStatus(const char* agent)
{
  // see header file for function documentation
  AliHLTLogging log;
 if (agent) {
   AliHLTModuleAgent* pCurrent=fgAnchor;
   while (pCurrent!=NULL && strcmp(pCurrent->GetName(), agent)!=0) pCurrent=pCurrent->fpNext;
   if (pCurrent) {
     log.Logging(kHLTLogInfo, "AliHLTModuleAgent::PrintStatus", "module agents", 
		 "agent %s available", pCurrent->GetName());
   } else {
     log.Logging(kHLTLogInfo, "AliHLTModuleAgent::PrintStatus", "module agents", 
		 "agent %s not found", agent);
   }
  } else {
   AliHLTModuleAgent* pCurrent=fgAnchor;
   log.Logging(kHLTLogInfo, "AliHLT", "", "-----------------------");
   log.Logging(kHLTLogInfo, "AliHLT", "", "available module agents");
   if (pCurrent==NULL)
     log.Logging(kHLTLogInfo, "AliHLT", "", "   none");
   while (pCurrent) {
     TString msg;
     msg.Form("   %s : %p", pCurrent->GetName(), pCurrent);
     log.Logging(kHLTLogInfo, "AliHLT", "", msg.Data());
     pCurrent=pCurrent->fpNext;
   }
   log.Logging(kHLTLogInfo, "AliHLT", "", "-----------------------");
  }
}

UInt_t AliHLTModuleAgent::GetDetectorMask() const
{
  /* all detectors */
  return (UInt_t)(-1);
}

int AliHLTModuleAgent::CreateConfigurations(AliHLTConfigurationHandler* /*handler*/,
					    AliRawReader* /*rawReader*/,
					    AliRunLoader* /*runloader*/) const
{
  // default method, nothing to be done, child classes can overload
  return 0;
}

const char* AliHLTModuleAgent::GetReconstructionChains(AliRawReader* /*rawReader*/,
						       AliRunLoader* /*runloader*/) const
{
  // default method, nothing to be done, child classes can overload
  return NULL;
}

const char* AliHLTModuleAgent::GetRequiredComponentLibraries() const
{
  // default method, nothing to be done, child classes can overload
  return NULL;
}

int AliHLTModuleAgent::GetHandlerDescription(AliHLTComponentDataType /*dt*/,
					     AliHLTUInt32_t /*spec*/,
					     AliHLTOUTHandlerDesc& /*desc*/) const
{
  // default method, nothing to be done, child classes can overload
  return 0;
}

AliHLTOUTHandler* AliHLTModuleAgent::GetOutputHandler(AliHLTComponentDataType /*dt*/,
						      AliHLTUInt32_t /*spec*/)
{
  // default method, nothing to be done, child classes can overload
  return NULL;
}

int AliHLTModuleAgent::DeleteOutputHandler(AliHLTOUTHandler* pInstance)
{
  // default method, simply deletes object
  if (!pInstance) return -EINVAL;
  HLTWarning("potential memory leak due to missing implementation, agent %s must implement function DeleteOutputHandler", GetModuleId());
  return -ENOSYS;
}

// likely to be moved to AliHLTOUTHandler
// AliRawStream* AliHLTModuleAgent::GetRawStream(AliHLTComponentDataType /*dt*/,
// 					      AliHLTUInt32_t /*spec*/,
// 					      const AliHLTOUT* /*pData*/) const
// {
//   // default method, nothing to be done, child classes can overload
//   return NULL;
// }

int AliHLTModuleAgent::ActivateComponentHandler(AliHLTComponentHandler* pHandler)
{
  // see header file for function documentation
  int iResult=0;
  if (pHandler==NULL) {
    if (fpComponentHandler!=NULL) {
      // reset and think about deregistration
      fpComponentHandler=NULL;
      HLTWarning("deregistration of components not yet implemented");
    }
    return 0;
  }
  if (fpComponentHandler!=NULL) {
    if (pHandler!=fpComponentHandler) {
      HLTError("only one component handler can be activated per agent");
      return -EINVAL;
    }
    return 0;
  }
  if ((iResult=RegisterComponents(pHandler))>=0) {
    fpComponentHandler=pHandler;
  }
  return iResult;
}

int AliHLTModuleAgent::RegisterComponents(AliHLTComponentHandler* /*pHandler*/) const
{
  // default method, nothing to be done, child classes can overload
  return 0;
}

AliHLTModulePreprocessor* AliHLTModuleAgent::GetPreprocessor()
{
  // default method, nothing to be done, child classes can overload
  return NULL;
}

AliHLTModuleAgent* AliHLTModuleAgent::fgAnchor=NULL;
AliHLTModuleAgent* AliHLTModuleAgent::fgCurrent=NULL;
int AliHLTModuleAgent::fgCount=0;

AliHLTModuleAgent* AliHLTModuleAgent::GetFirstAgent()
{
  // see header file for function documentation
  fgCurrent=fgAnchor;
  return fgAnchor;
}

AliHLTModuleAgent* AliHLTModuleAgent::GetNextAgent()
{
  // see header file for function documentation
  if (fgCurrent!=NULL) fgCurrent=fgCurrent->fpNext;
  return fgCurrent;
}

string AliHLTModuleAgent::GetAgentIds()
{
  // see header file for function documentation
  string ids;
  ids.clear();
  for (AliHLTModuleAgent* pCurrent=fgAnchor;
       pCurrent;
       pCurrent=pCurrent->fpNext) {
    if (ids.size()>0) ids+=" ";
    ids+=pCurrent->GetModuleId();
  }

  return ids;
}

int AliHLTModuleAgent::Register(AliHLTModuleAgent* pAgent)
{
  // see header file for function documentation
  AliHLTLogging log;
  if (!pAgent) return -EINVAL;
  // The following check is for extra protection. In some strange cases the agent might
  // try to register itself more than once. So we need to check for that and prevent it.
  // Otherwise we create a cycle in our linked list and go into an infinite loop.
  AliHLTModuleAgent* current=fgAnchor;
  while (current!=NULL) {
    if (current == pAgent) return 0;
    current = current->fpNext;
  }
  if (fgAnchor==NULL) {
    fgAnchor=pAgent;
  } else {
    pAgent->fpNext=fgAnchor;
    fgAnchor=pAgent;
  }
  //  log.Logging(kHLTLogDebug, "AliHLTModuleAgent::Register", "", "module agent %p registered", pAgent);
  fgCount++;
  return 0;	
}

int AliHLTModuleAgent::Unregister(AliHLTModuleAgent* pAgent)
{
  // see header file for function documentation
  AliHLTLogging log;
  if (!pAgent) return -EINVAL;
  fgCurrent=NULL;
  AliHLTModuleAgent* prev=NULL;
  AliHLTModuleAgent* handler=fgAnchor;
  while (handler!=NULL && handler!=pAgent) {
    prev=handler;
    handler=handler->fpNext;
  }
  if (handler) {
    if (prev==NULL) {
      fgAnchor=handler->fpNext;
    } else {
      prev->fpNext=handler->fpNext;
    }
    //log.Logging(kHLTLogDebug, "AliHLTModuleAgent::Unregister", "", "module agent %p removed", pAgent);
    fgCount--;
  }
  return 0;
}
 AliHLTModuleAgent.cxx:1
 AliHLTModuleAgent.cxx:2
 AliHLTModuleAgent.cxx:3
 AliHLTModuleAgent.cxx:4
 AliHLTModuleAgent.cxx:5
 AliHLTModuleAgent.cxx:6
 AliHLTModuleAgent.cxx:7
 AliHLTModuleAgent.cxx:8
 AliHLTModuleAgent.cxx:9
 AliHLTModuleAgent.cxx:10
 AliHLTModuleAgent.cxx:11
 AliHLTModuleAgent.cxx:12
 AliHLTModuleAgent.cxx:13
 AliHLTModuleAgent.cxx:14
 AliHLTModuleAgent.cxx:15
 AliHLTModuleAgent.cxx:16
 AliHLTModuleAgent.cxx:17
 AliHLTModuleAgent.cxx:18
 AliHLTModuleAgent.cxx:19
 AliHLTModuleAgent.cxx:20
 AliHLTModuleAgent.cxx:21
 AliHLTModuleAgent.cxx:22
 AliHLTModuleAgent.cxx:23
 AliHLTModuleAgent.cxx:24
 AliHLTModuleAgent.cxx:25
 AliHLTModuleAgent.cxx:26
 AliHLTModuleAgent.cxx:27
 AliHLTModuleAgent.cxx:28
 AliHLTModuleAgent.cxx:29
 AliHLTModuleAgent.cxx:30
 AliHLTModuleAgent.cxx:31
 AliHLTModuleAgent.cxx:32
 AliHLTModuleAgent.cxx:33
 AliHLTModuleAgent.cxx:34
 AliHLTModuleAgent.cxx:35
 AliHLTModuleAgent.cxx:36
 AliHLTModuleAgent.cxx:37
 AliHLTModuleAgent.cxx:38
 AliHLTModuleAgent.cxx:39
 AliHLTModuleAgent.cxx:40
 AliHLTModuleAgent.cxx:41
 AliHLTModuleAgent.cxx:42
 AliHLTModuleAgent.cxx:43
 AliHLTModuleAgent.cxx:44
 AliHLTModuleAgent.cxx:45
 AliHLTModuleAgent.cxx:46
 AliHLTModuleAgent.cxx:47
 AliHLTModuleAgent.cxx:48
 AliHLTModuleAgent.cxx:49
 AliHLTModuleAgent.cxx:50
 AliHLTModuleAgent.cxx:51
 AliHLTModuleAgent.cxx:52
 AliHLTModuleAgent.cxx:53
 AliHLTModuleAgent.cxx:54
 AliHLTModuleAgent.cxx:55
 AliHLTModuleAgent.cxx:56
 AliHLTModuleAgent.cxx:57
 AliHLTModuleAgent.cxx:58
 AliHLTModuleAgent.cxx:59
 AliHLTModuleAgent.cxx:60
 AliHLTModuleAgent.cxx:61
 AliHLTModuleAgent.cxx:62
 AliHLTModuleAgent.cxx:63
 AliHLTModuleAgent.cxx:64
 AliHLTModuleAgent.cxx:65
 AliHLTModuleAgent.cxx:66
 AliHLTModuleAgent.cxx:67
 AliHLTModuleAgent.cxx:68
 AliHLTModuleAgent.cxx:69
 AliHLTModuleAgent.cxx:70
 AliHLTModuleAgent.cxx:71
 AliHLTModuleAgent.cxx:72
 AliHLTModuleAgent.cxx:73
 AliHLTModuleAgent.cxx:74
 AliHLTModuleAgent.cxx:75
 AliHLTModuleAgent.cxx:76
 AliHLTModuleAgent.cxx:77
 AliHLTModuleAgent.cxx:78
 AliHLTModuleAgent.cxx:79
 AliHLTModuleAgent.cxx:80
 AliHLTModuleAgent.cxx:81
 AliHLTModuleAgent.cxx:82
 AliHLTModuleAgent.cxx:83
 AliHLTModuleAgent.cxx:84
 AliHLTModuleAgent.cxx:85
 AliHLTModuleAgent.cxx:86
 AliHLTModuleAgent.cxx:87
 AliHLTModuleAgent.cxx:88
 AliHLTModuleAgent.cxx:89
 AliHLTModuleAgent.cxx:90
 AliHLTModuleAgent.cxx:91
 AliHLTModuleAgent.cxx:92
 AliHLTModuleAgent.cxx:93
 AliHLTModuleAgent.cxx:94
 AliHLTModuleAgent.cxx:95
 AliHLTModuleAgent.cxx:96
 AliHLTModuleAgent.cxx:97
 AliHLTModuleAgent.cxx:98
 AliHLTModuleAgent.cxx:99
 AliHLTModuleAgent.cxx:100
 AliHLTModuleAgent.cxx:101
 AliHLTModuleAgent.cxx:102
 AliHLTModuleAgent.cxx:103
 AliHLTModuleAgent.cxx:104
 AliHLTModuleAgent.cxx:105
 AliHLTModuleAgent.cxx:106
 AliHLTModuleAgent.cxx:107
 AliHLTModuleAgent.cxx:108
 AliHLTModuleAgent.cxx:109
 AliHLTModuleAgent.cxx:110
 AliHLTModuleAgent.cxx:111
 AliHLTModuleAgent.cxx:112
 AliHLTModuleAgent.cxx:113
 AliHLTModuleAgent.cxx:114
 AliHLTModuleAgent.cxx:115
 AliHLTModuleAgent.cxx:116
 AliHLTModuleAgent.cxx:117
 AliHLTModuleAgent.cxx:118
 AliHLTModuleAgent.cxx:119
 AliHLTModuleAgent.cxx:120
 AliHLTModuleAgent.cxx:121
 AliHLTModuleAgent.cxx:122
 AliHLTModuleAgent.cxx:123
 AliHLTModuleAgent.cxx:124
 AliHLTModuleAgent.cxx:125
 AliHLTModuleAgent.cxx:126
 AliHLTModuleAgent.cxx:127
 AliHLTModuleAgent.cxx:128
 AliHLTModuleAgent.cxx:129
 AliHLTModuleAgent.cxx:130
 AliHLTModuleAgent.cxx:131
 AliHLTModuleAgent.cxx:132
 AliHLTModuleAgent.cxx:133
 AliHLTModuleAgent.cxx:134
 AliHLTModuleAgent.cxx:135
 AliHLTModuleAgent.cxx:136
 AliHLTModuleAgent.cxx:137
 AliHLTModuleAgent.cxx:138
 AliHLTModuleAgent.cxx:139
 AliHLTModuleAgent.cxx:140
 AliHLTModuleAgent.cxx:141
 AliHLTModuleAgent.cxx:142
 AliHLTModuleAgent.cxx:143
 AliHLTModuleAgent.cxx:144
 AliHLTModuleAgent.cxx:145
 AliHLTModuleAgent.cxx:146
 AliHLTModuleAgent.cxx:147
 AliHLTModuleAgent.cxx:148
 AliHLTModuleAgent.cxx:149
 AliHLTModuleAgent.cxx:150
 AliHLTModuleAgent.cxx:151
 AliHLTModuleAgent.cxx:152
 AliHLTModuleAgent.cxx:153
 AliHLTModuleAgent.cxx:154
 AliHLTModuleAgent.cxx:155
 AliHLTModuleAgent.cxx:156
 AliHLTModuleAgent.cxx:157
 AliHLTModuleAgent.cxx:158
 AliHLTModuleAgent.cxx:159
 AliHLTModuleAgent.cxx:160
 AliHLTModuleAgent.cxx:161
 AliHLTModuleAgent.cxx:162
 AliHLTModuleAgent.cxx:163
 AliHLTModuleAgent.cxx:164
 AliHLTModuleAgent.cxx:165
 AliHLTModuleAgent.cxx:166
 AliHLTModuleAgent.cxx:167
 AliHLTModuleAgent.cxx:168
 AliHLTModuleAgent.cxx:169
 AliHLTModuleAgent.cxx:170
 AliHLTModuleAgent.cxx:171
 AliHLTModuleAgent.cxx:172
 AliHLTModuleAgent.cxx:173
 AliHLTModuleAgent.cxx:174
 AliHLTModuleAgent.cxx:175
 AliHLTModuleAgent.cxx:176
 AliHLTModuleAgent.cxx:177
 AliHLTModuleAgent.cxx:178
 AliHLTModuleAgent.cxx:179
 AliHLTModuleAgent.cxx:180
 AliHLTModuleAgent.cxx:181
 AliHLTModuleAgent.cxx:182
 AliHLTModuleAgent.cxx:183
 AliHLTModuleAgent.cxx:184
 AliHLTModuleAgent.cxx:185
 AliHLTModuleAgent.cxx:186
 AliHLTModuleAgent.cxx:187
 AliHLTModuleAgent.cxx:188
 AliHLTModuleAgent.cxx:189
 AliHLTModuleAgent.cxx:190
 AliHLTModuleAgent.cxx:191
 AliHLTModuleAgent.cxx:192
 AliHLTModuleAgent.cxx:193
 AliHLTModuleAgent.cxx:194
 AliHLTModuleAgent.cxx:195
 AliHLTModuleAgent.cxx:196
 AliHLTModuleAgent.cxx:197
 AliHLTModuleAgent.cxx:198
 AliHLTModuleAgent.cxx:199
 AliHLTModuleAgent.cxx:200
 AliHLTModuleAgent.cxx:201
 AliHLTModuleAgent.cxx:202
 AliHLTModuleAgent.cxx:203
 AliHLTModuleAgent.cxx:204
 AliHLTModuleAgent.cxx:205
 AliHLTModuleAgent.cxx:206
 AliHLTModuleAgent.cxx:207
 AliHLTModuleAgent.cxx:208
 AliHLTModuleAgent.cxx:209
 AliHLTModuleAgent.cxx:210
 AliHLTModuleAgent.cxx:211
 AliHLTModuleAgent.cxx:212
 AliHLTModuleAgent.cxx:213
 AliHLTModuleAgent.cxx:214
 AliHLTModuleAgent.cxx:215
 AliHLTModuleAgent.cxx:216
 AliHLTModuleAgent.cxx:217
 AliHLTModuleAgent.cxx:218
 AliHLTModuleAgent.cxx:219
 AliHLTModuleAgent.cxx:220
 AliHLTModuleAgent.cxx:221
 AliHLTModuleAgent.cxx:222
 AliHLTModuleAgent.cxx:223
 AliHLTModuleAgent.cxx:224
 AliHLTModuleAgent.cxx:225
 AliHLTModuleAgent.cxx:226
 AliHLTModuleAgent.cxx:227
 AliHLTModuleAgent.cxx:228
 AliHLTModuleAgent.cxx:229
 AliHLTModuleAgent.cxx:230
 AliHLTModuleAgent.cxx:231
 AliHLTModuleAgent.cxx:232
 AliHLTModuleAgent.cxx:233
 AliHLTModuleAgent.cxx:234
 AliHLTModuleAgent.cxx:235
 AliHLTModuleAgent.cxx:236
 AliHLTModuleAgent.cxx:237
 AliHLTModuleAgent.cxx:238
 AliHLTModuleAgent.cxx:239
 AliHLTModuleAgent.cxx:240
 AliHLTModuleAgent.cxx:241
 AliHLTModuleAgent.cxx:242
 AliHLTModuleAgent.cxx:243
 AliHLTModuleAgent.cxx:244
 AliHLTModuleAgent.cxx:245
 AliHLTModuleAgent.cxx:246
 AliHLTModuleAgent.cxx:247
 AliHLTModuleAgent.cxx:248
 AliHLTModuleAgent.cxx:249
 AliHLTModuleAgent.cxx:250
 AliHLTModuleAgent.cxx:251
 AliHLTModuleAgent.cxx:252
 AliHLTModuleAgent.cxx:253
 AliHLTModuleAgent.cxx:254
 AliHLTModuleAgent.cxx:255
 AliHLTModuleAgent.cxx:256
 AliHLTModuleAgent.cxx:257
 AliHLTModuleAgent.cxx:258
 AliHLTModuleAgent.cxx:259
 AliHLTModuleAgent.cxx:260
 AliHLTModuleAgent.cxx:261
 AliHLTModuleAgent.cxx:262
 AliHLTModuleAgent.cxx:263
 AliHLTModuleAgent.cxx:264
 AliHLTModuleAgent.cxx:265
 AliHLTModuleAgent.cxx:266
 AliHLTModuleAgent.cxx:267
 AliHLTModuleAgent.cxx:268
 AliHLTModuleAgent.cxx:269
 AliHLTModuleAgent.cxx:270
 AliHLTModuleAgent.cxx:271
 AliHLTModuleAgent.cxx:272
 AliHLTModuleAgent.cxx:273
 AliHLTModuleAgent.cxx:274
 AliHLTModuleAgent.cxx:275
 AliHLTModuleAgent.cxx:276
 AliHLTModuleAgent.cxx:277