]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTOUTHomerBuffer.cxx
- HOMER library manager completed
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTOUTHomerBuffer.cxx
1 // $Id$
2
3 /**************************************************************************
4  * This file is property of and copyright by the ALICE HLT Project        * 
5  * ALICE Experiment at CERN, All rights reserved.                         *
6  *                                                                        *
7  * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
8  *                  for The ALICE HLT Project.                            *
9  *                                                                        *
10  * Permission to use, copy, modify and distribute this software and its   *
11  * documentation strictly for non-commercial purposes is hereby granted   *
12  * without fee, provided that the above copyright notice appears in all   *
13  * copies and that both the copyright notice and this permission notice   *
14  * appear in the supporting documentation. The authors make no claims     *
15  * about the suitability of this software for any purpose. It is          *
16  * provided "as is" without express or implied warranty.                  *
17  **************************************************************************/
18
19 /** @file   AliHLTOUTHomerBuffer.cxx
20     @author Matthias Richter
21     @date   
22     @brief  HLTOUT data wrapper for buffer in HOMER format.               */
23
24 // see header file for class documentation
25 // or
26 // refer to README to build package
27 // or
28 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
29
30 #include <cerrno>
31 #include <cassert>
32 #include "AliHLTOUTHomerBuffer.h"
33 #include "AliHLTHOMERReader.h"
34 #include "AliHLTHOMERLibManager.h"
35
36 /** ROOT macro for the implementation of ROOT specific class methods */
37 ClassImp(AliHLTOUTHomerBuffer)
38
39 AliHLTOUTHomerBuffer::AliHLTOUTHomerBuffer(const AliHLTUInt8_t* pBuffer, int size)
40   :
41   AliHLTOUT(),
42   fpManager(new AliHLTHOMERLibManager),
43   fpBuffer(pBuffer),
44   fSize(size),
45   fpReader(NULL)
46 {
47   // see header file for class documentation
48   // or
49   // refer to README to build package
50   // or
51   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
52   assert(sizeof(homer_uint64)==kAliHLTComponentDataTypefIDsize);
53   assert(sizeof(homer_uint32)==kAliHLTComponentDataTypefOriginSize);
54   assert(fpManager);
55 }
56
57 AliHLTOUTHomerBuffer::~AliHLTOUTHomerBuffer()
58 {
59   // see header file for class documentation
60   if (fpManager) {
61     if (fpReader) fpManager->DeleteReader(fpReader);
62     delete fpManager;
63     fpManager=NULL;
64     fpReader=NULL;
65   }
66 }
67
68 int AliHLTOUTHomerBuffer::GenerateIndex()
69 {
70   // see header file for class documentation
71   int iResult=0;
72   if (!fpReader) {
73     if (fpManager) {
74       fpReader=fpManager->OpenReader(fpBuffer, fSize);
75     }
76   }
77   if (fpReader) {
78     iResult=ScanReader(fpReader);
79   } else {
80     iResult=-ENODEV;
81   }
82   return iResult;
83 }
84
85 int AliHLTOUTHomerBuffer::GetDataBuffer(AliHLTUInt32_t index, const AliHLTUInt8_t* &pBuffer, 
86                                         AliHLTUInt32_t& size)
87 {
88   // see header file for class documentation
89   int iResult=0;
90   if (fpReader) {
91     if ((pBuffer=static_cast<const AliHLTUInt8_t*>(fpReader->GetBlockData(index)))!=NULL) {
92       size=fpReader->GetBlockDataLength(index);
93     } else {
94       iResult=-ENOENT;
95     }
96   } else {
97     iResult=-ENODEV;
98   }
99   return iResult;
100 }
101
102 AliHLTOUT::AliHLTOUTByteOrder_t AliHLTOUTHomerBuffer::CheckBlockByteOrder(AliHLTUInt32_t index)
103 {
104   if (fpReader) {
105     return static_cast<AliHLTOUTByteOrder_t>(fpReader->GetBlockByteOrder(index));
106   }
107   return kInvalidByteOrder;
108 }
109
110 int AliHLTOUTHomerBuffer::CheckBlockAlignment(AliHLTUInt32_t index, AliHLTOUT::AliHLTOUTDataType_t type)
111 {
112   if (fpReader) {
113     return fpReader->GetBlockTypeAlignment(index, static_cast<homer_uint8>(type));
114   }
115   return -ENODATA;
116 }
117
118 int AliHLTOUTHomerBuffer::ScanReader(AliHLTMonitoringReader* pReader, AliHLTUInt32_t offset)
119 {
120   // see header file for class documentation
121   int iResult=0;
122   if (pReader) {
123     AliHLTUInt32_t nofBlocks=pReader->GetBlockCnt();
124     AliHLTUInt32_t tmp1=0x1;
125     AliHLTUInt32_t tmp2=offset;
126
127     // first check if the offset allows to add all data blocks without exceeding the
128     // range
129     while (nofBlocks<tmp1 && tmp2>0) {
130       if (tmp2&0x1) {
131         HLTError("index range %#x exceeded for %d data blocks", nofBlocks, offset);
132         iResult=-ERANGE;
133       }
134       tmp2>>=1;
135       tmp1<<=1;
136     }
137
138     // loop over data blocks
139     HLTDebug("generating index for %d data blocks of reader with offset %#x", nofBlocks, offset);
140     for (AliHLTUInt32_t i=0; i<nofBlocks && iResult>=0; i++) {
141       homer_uint64 id=pReader->GetBlockDataType( i );
142       homer_uint32 origin=pReader->GetBlockDataOrigin( i );
143       homer_uint32 spec=pReader->GetBlockDataSpec( i );
144       AliHLTComponentDataType dt;
145       memcpy(&dt.fID, &id, kAliHLTComponentDataTypefIDsize);
146       memcpy(&dt.fOrigin, &origin, kAliHLTComponentDataTypefOriginSize);
147       AliHLTOUTBlockDescriptor desc(dt, spec, offset|i);
148       iResult=AddBlockDescriptor(desc);
149     }
150   } else {
151     iResult=-ENODEV;
152   }
153   return iResult;
154 }
155