+int AliHLTSystem::AddHLTOUTTask(const char* hltoutchains)
+{
+ // see header file for class documentation
+ int iResult=0;
+ if (!hltoutchains || hltoutchains[0]==0) return 0;
+
+ // check chains for output
+ TString chains=hltoutchains;
+ TObjArray* pTokens=chains.Tokenize(" ");
+ if (pTokens) {
+ int iEntries=pTokens->GetEntriesFast();
+ for (int i=0; i<iEntries && iResult>=0; i++) {
+ const char* token=((TObjString*)pTokens->At(i))->String().Data();
+ AliHLTConfiguration* pConf=fpConfigurationHandler->FindConfiguration(token);
+ if (pConf) {
+ TString cid=pConf->GetComponentID();
+ if (fpComponentHandler->HasOutputData(cid.Data())) {
+ continue;
+ }
+ } else {
+ HLTWarning("can not find configuration %s", token);
+ }
+ // remove from the list of hltout chains
+ chains.ReplaceAll(token, "");
+ }
+ delete pTokens;
+ }
+
+ // do not create the HLTOUT task if none of the chains have output
+ if (chains.IsNull()) return 0;
+
+ // indicate the task to be available
+ iResult=1;
+
+ if (fpHLTOUTTask) {
+ if (strcmp(chains.Data(), fpHLTOUTTask->GetSourceChains())==0) {
+ HLTWarning("HLTOUT task already added for chains \"%s\" %p", chains.Data(), fpHLTOUTTask);
+ } else {
+ HLTError("HLTOUT task already added for chains \"%s\" %p, ignoring new chains \"%s\"",
+ fpHLTOUTTask->GetSourceChains(), fpHLTOUTTask, chains.Data());
+ }
+ return iResult;
+ }
+
+ fpHLTOUTTask=new AliHLTOUTTask(chains);
+ if (fpHLTOUTTask) {
+ if (fpHLTOUTTask->GetConf() &&
+ (fpHLTOUTTask->GetConf()->SourcesResolved()>0 ||
+ fpHLTOUTTask->GetConf()->ExtractSources()>0)) {
+ iResult=InsertTask(fpHLTOUTTask);
+ } else {
+ HLTError("HLTOUT task (%s) sources not resolved", fpHLTOUTTask->GetName());
+ iResult=-ENOENT;
+ }
+
+ if (iResult<0) {
+ delete fpHLTOUTTask;
+ }
+
+ } else {
+ iResult=-ENOMEM;
+ }
+ return iResult;
+}
+