further work on HLTOUT treatment
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTOUTHomerBuffer.cxx
index 0f95b3ca4ba67eb1ea227e9ea13a59e856ffa293..ebeb347c67a70c0b5dd00be32f366803154e029f 100644 (file)
@@ -19,7 +19,7 @@
 /** @file   AliHLTOUTHomerBuffer.cxx
     @author Matthias Richter
     @date   
-    @brief  HLTOUT data wrapper for AliRawReader.                         */
+    @brief  HLTOUT data wrapper for buffer in HOMER format.               */
 
 // see header file for class documentation
 // or
 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
 
 #include <cerrno>
+#include <cassert>
 #include "AliHLTOUTHomerBuffer.h"
 #include "AliHLTHOMERReader.h"
+#include "AliHLTHOMERLibManager.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTOUTHomerBuffer)
 
-AliHLTOUTHomerBuffer::AliHLTOUTHomerBuffer(const AliHLTUInt8_t* pBuffer)
+AliHLTOUTHomerBuffer::AliHLTOUTHomerBuffer(const AliHLTUInt8_t* pBuffer, int size)
   :
   AliHLTOUT(),
   fpBuffer(pBuffer),
-  fpReader(NULL)
+  fSize(size),
+  fpReader(NULL),
+  fpManager(new AliHLTHOMERLibManager)
 {
   // see header file for class documentation
   // or
   // refer to README to build package
   // or
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+  assert(sizeof(homer_uint64)==kAliHLTComponentDataTypefIDsize);
+  assert(sizeof(homer_uint32)==kAliHLTComponentDataTypefOriginSize);
+  assert(fpManager);
 }
 
 AliHLTOUTHomerBuffer::~AliHLTOUTHomerBuffer()
 {
   // see header file for class documentation
+  if (fpManager) {
+    if (fpReader) fpManager->DeleteReader(fpReader);
+    delete fpManager;
+    fpManager=NULL;
+    fpReader=NULL;
+  }
 }
 
 int AliHLTOUTHomerBuffer::GenerateIndex()
 {
   // see header file for class documentation
   int iResult=0;
+  if (!fpReader) {
+    if (fpManager) {
+      fpReader=fpManager->OpenReader(fpBuffer, fSize);
+    }
+  }
+  if (fpReader) {
+    iResult=ScanReader(fpReader);
+  } else {
+    iResult=-ENODEV;
+  }
   return iResult;
 }
 
@@ -75,3 +98,58 @@ int AliHLTOUTHomerBuffer::GetDataBuffer(AliHLTUInt32_t index, const AliHLTUInt8_
   }
   return iResult;
 }
+
+AliHLTOUT::AliHLTOUTByteOrder_t AliHLTOUTHomerBuffer::CheckBlockByteOrder(AliHLTUInt32_t index)
+{
+  if (fpReader) {
+    return static_cast<AliHLTOUTByteOrder_t>(fpReader->GetBlockByteOrder(index));
+  }
+  return kInvalidByteOrder;
+}
+
+int AliHLTOUTHomerBuffer::CheckBlockAlignment(AliHLTUInt32_t index, AliHLTOUT::AliHLTOUTDataType_t type)
+{
+  if (fpReader) {
+    return fpReader->GetBlockTypeAlignment(index, static_cast<homer_uint8>(type));
+  }
+  return -ENODATA;
+}
+
+int AliHLTOUTHomerBuffer::ScanReader(AliHLTHOMERReader* pReader, AliHLTUInt32_t offset)
+{
+  // see header file for class documentation
+  int iResult=0;
+  if (pReader) {
+    AliHLTUInt32_t nofBlocks=pReader->GetBlockCnt();
+    AliHLTUInt32_t tmp1=0x1;
+    AliHLTUInt32_t tmp2=offset;
+
+    // first check if the offset allows to add all data blocks without exceeding the
+    // range
+    while (nofBlocks<tmp1 && tmp2>0) {
+      if (tmp2&0x1) {
+       HLTError("index range %#x exceeded for %d data blocks", nofBlocks, offset);
+       iResult=-ERANGE;
+      }
+      tmp2>>1;
+      tmp1<<1;
+    }
+
+    // loop over data blocks
+    HLTDebug("generating index for %d data blocks of reader with offset %#x", nofBlocks, offset);
+    for (AliHLTUInt32_t i=0; i<nofBlocks && iResult>=0; i++) {
+      homer_uint64 id=pReader->GetBlockDataType( i );
+      homer_uint32 origin=pReader->GetBlockDataOrigin( i );
+      homer_uint32 spec=pReader->GetBlockDataSpec( i );
+      AliHLTComponentDataType dt;
+      memcpy(&dt.fID, &id, kAliHLTComponentDataTypefIDsize);
+      memcpy(&dt.fOrigin, &origin, kAliHLTComponentDataTypefOriginSize);
+      AliHLTOUTBlockDescriptor desc(dt, spec, offset|i);
+      iResult=AddBlockDescriptor(desc);
+    }
+  } else {
+    iResult=-ENODEV;
+  }
+  return iResult;
+}
+