ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
/// 
/// This is a class for reading raw data memory buffers.
///
///////////////////////////////////////////////////////////////////////////////

#include "AliRawReaderMemory.h"
#include <TSystem.h>


ClassImp(AliRawReaderMemory)


AliRawReaderMemory::AliRawReaderMemory() :
  fPosition(0),
  fBuffers(),
  fCurrent(0)
{
// create an object to read digits from
// the given memory location
}

AliRawReaderMemory::AliRawReaderMemory(UChar_t* memory, UInt_t size) :
  fPosition(0),
  fBuffers(),
  fCurrent(0)
{
// create an object to read digits from the given memory
  fBuffers.push_back(AliRRMBuffer(memory, size, -1));
}

AliRawReaderMemory::~AliRawReaderMemory()
{
// close the input memory
}

void AliRawReaderMemory::RequireHeader(Bool_t required)
{
  // Reading of raw data in case of missing
  // raw data header is not implemented for
  // this class
  if (!required)
    Fatal("AliRawReaderMemory","Reading of raw data without raw data header is not implemented !");

  AliRawReader::RequireHeader(required);
}

Bool_t AliRawReaderMemory::ReadHeader()
{
// read a data header at the current buffer position
// returns kFALSE if the mini header could not be read

  Bool_t result=kFALSE;
  if (fCurrent>=fBuffers.size()) return kFALSE;

  do {
  result=kFALSE;
  do {
    if (fBuffers[fCurrent].GetEquipmentId() == -1)
      {
	Warning("ReadHeader", "The equipment ID is not set for the DDL memory buffer.");
      }
    if (!fBuffers[fCurrent].GetBuffer()) break;

    // Check if we would not read past the end of the buffer.
    if ( fPosition+fCount >= fBuffers[fCurrent].GetBufferSize() ) break;

    fHeader = reinterpret_cast<AliRawDataHeader*>(fBuffers[fCurrent].GetBuffer()+fPosition+fCount);
    fHeaderV3 = reinterpret_cast<AliRawDataHeaderV3*>(fBuffers[fCurrent].GetBuffer()+fPosition+fCount);

    //Access to version and size is uniform for V2 and V3 
    UChar_t version = fHeader->GetVersion();
    UInt_t size = fHeader->fSize;
    Int_t headerSize = 0;

    if(version == 3) {
      fHeader=NULL;
      headerSize = sizeof(AliRawDataHeaderV3);
    } else if(version == 2) {
      fHeaderV3=NULL;
      headerSize = sizeof(AliRawDataHeader);
    } else {
      Error("ReadHeader", "Wrong raw data header version: %d. Expected: 2 or 3.", version);
      return kFALSE;
    }
    
    // Check that the header is sane, that is the size does not go past the buffer.
    // Otherwise try again at the next word location.
    while (1) {
      if ( ( (size == 0) ||
	   ((Int_t)fPosition + fCount + (Int_t)size > (Int_t)fBuffers[fCurrent].GetBufferSize() ) )
	  && size != 0xFFFFFFFF) {

	if (fPosition + sizeof(UInt_t) <= fBuffers[fCurrent].GetBufferSize()) {
	  fPosition += sizeof(UInt_t);
	  continue;
	} else {
	  Error("ReadHeader", "Could not find a valid DDL header!");
	  return kFALSE;
	}
      } else {
	fPosition += fCount + headerSize;
      }
      break;
    }

    if (size != 0xFFFFFFFF) {
      fCount = (Int_t)size - headerSize;
    } else {
      fCount = fBuffers[fCurrent].GetBufferSize() - headerSize;
    }
  } while (!(result=IsSelected()) && OpenNextBuffer());
  } while (!result && OpenNextBuffer());

  return result;
}

Bool_t AliRawReaderMemory::OpenNextBuffer()
{
  // increment to next buffer
  fPosition=0;
  fCount=0;
  if (fCurrent>=fBuffers.size()) return kFALSE;
  if (++fCurrent>=fBuffers.size()) return kFALSE;
  return kTRUE;
}

Bool_t AliRawReaderMemory::ReadNextData(UChar_t*& data)
{
// reads the next payload at the current buffer position
// returns kFALSE if the data could not be read

  while (fCount == 0) {
    if (!ReadHeader()) return kFALSE;
  }

  if(fCount < 0){
    Error("ReadNextData","Cannot read data, payload is negative");
    return kFALSE;
  }

  UInt_t currentPosition = fPosition;
  fPosition += fCount;
  fCount = 0;

  if(fBuffers[fCurrent].GetBufferSize()<currentPosition){
    Error("ReadNextData","Current position exceeds buffersize.");
    return kFALSE;
  }
  data = fBuffers[fCurrent].GetBuffer()+currentPosition;
  return kTRUE;
}

Bool_t AliRawReaderMemory::ReadNext(UChar_t* data, Int_t size)
{
// reads the next block of data at the current buffer position
// but does not shift to the next equipment. The next equipment
// must be activated by calling ReadHeader
// returns kFALSE if the data could not be read

  
  if (fCurrent>=fBuffers.size()) return kFALSE;
  if ( fBuffers[fCurrent].GetBufferSize()-fPosition < (UInt_t)size ) return kFALSE;

  memcpy( data, fBuffers[fCurrent].GetBuffer()+fPosition, size );
  fCount -= size;
  fPosition += size;
  return kTRUE;
}


Bool_t AliRawReaderMemory::Reset()
{
// reset the current position in the buffer to the beginning of the curevent

  fHeader = NULL;
  fHeaderV3 = NULL;
  fCount = 0;
  fPosition = 0;
  fCurrent=0;
  return kTRUE;
}

Bool_t AliRawReaderMemory::NextEvent()
{
// each memory buffer always contains only one event
  if (fEventNumber < 0) {
    fEventNumber++;
    return kTRUE;
  }
  else
    return kFALSE; 
}

Bool_t AliRawReaderMemory::RewindEvents()
{
// reset the event counter
  fEventNumber = -1;

  return Reset();
}

Bool_t AliRawReaderMemory::SetMemory( UChar_t* memory, ULong_t size )
{
  // SetMemory function kept for backward compatibility, only allowed
  // if no blocks have been added so far 
  if (!memory || size<=0) return kFALSE;
  if (fBuffers.size()>1 || (fBuffers.size()==1 && fPosition==0 && fCurrent==0)) {
    Error("SetMemory","can not SetMemory for multiple buffers, use AddBuffer(...)");
    return kFALSE;
  }
  if (fBuffers.size()==1) fBuffers.pop_back();
  fBuffers.push_back(AliRRMBuffer(memory, size, -1));
  fCurrent=0;
  fHeader = NULL;
  fHeaderV3 = NULL;
  fCount = 0;
  fPosition = 0;
  return kTRUE;
}

void  AliRawReaderMemory::SetEquipmentID(Int_t id)
{
  // SetMemory function kept for backward compatibility, only allowed
  // if no blocks have been added so far, set equipment id of the first
  // buffer
  if (fBuffers.size()>1) {
    Error("SetEquipmentID", "can not SetEquipmentID for multiple buffers, use AddBuffer(...)");
    return;
  }
  if (fBuffers.size()==0 || fCurrent>=fBuffers.size()) {
    Error("SetEquipmentID", "no block available to set equipment id");
    return;    
  }
  fBuffers[fCurrent].SetEquipmentId(id);
}

Int_t AliRawReaderMemory::GetEquipmentSize() const
{
  // get the size of the equipment, that is payload + CDH
  if (fCurrent>=fBuffers.size()) return 0;
  return fBuffers[fCurrent].GetBufferSize();
}

Int_t AliRawReaderMemory::GetEquipmentId() const
{
  // get the current equipment id
  if (fCurrent>=fBuffers.size()) return -1;
  return fBuffers[fCurrent].GetEquipmentId();
}

Bool_t AliRawReaderMemory::AddBuffer(UChar_t* memory, ULong_t size, Int_t equipmentId )
{
  // Add a buffer to the list
  if (!memory || size<=0 || equipmentId<0 ) return kFALSE;
  fBuffers.push_back(AliRRMBuffer(memory, size, equipmentId));
  return kTRUE;
}

void AliRawReaderMemory::ClearBuffers()
{
  // Clear the buffer list
  fBuffers.clear();
  Reset();
}

AliRawReaderMemory::AliRRMBuffer::AliRRMBuffer()
  :
  fBuffer(NULL),
  fBufferSize(0),
  fEquipmentId(-1)
{
  // ctor
}

AliRawReaderMemory::AliRRMBuffer::AliRRMBuffer(UChar_t* pBuffer, UInt_t bufferSize, Int_t equipmentId)
  :
  fBuffer(pBuffer),
  fBufferSize(bufferSize),
  fEquipmentId(equipmentId)
{
  // ctor
}

AliRawReaderMemory::AliRRMBuffer::~AliRRMBuffer()
{
  // dtor
}

AliRawReaderMemory::AliRRMBuffer::AliRRMBuffer(const AliRRMBuffer& src)
  :
  fBuffer(src.fBuffer),
  fBufferSize(src.fBufferSize),
  fEquipmentId(src.fEquipmentId)
{
  // copy ctor, there are no buffers allocated internally, pointers
  // are just copied
}

AliRawReaderMemory::AliRRMBuffer& AliRawReaderMemory::AliRRMBuffer::operator=(const AliRRMBuffer& src)
{
  // assignment op
  if(&src == this) return *this;
  fBuffer=src.fBuffer;
  fBufferSize=src.fBufferSize;
  fEquipmentId=src.fEquipmentId;
  return *this;
}
 AliRawReaderMemory.cxx:1
 AliRawReaderMemory.cxx:2
 AliRawReaderMemory.cxx:3
 AliRawReaderMemory.cxx:4
 AliRawReaderMemory.cxx:5
 AliRawReaderMemory.cxx:6
 AliRawReaderMemory.cxx:7
 AliRawReaderMemory.cxx:8
 AliRawReaderMemory.cxx:9
 AliRawReaderMemory.cxx:10
 AliRawReaderMemory.cxx:11
 AliRawReaderMemory.cxx:12
 AliRawReaderMemory.cxx:13
 AliRawReaderMemory.cxx:14
 AliRawReaderMemory.cxx:15
 AliRawReaderMemory.cxx:16
 AliRawReaderMemory.cxx:17
 AliRawReaderMemory.cxx:18
 AliRawReaderMemory.cxx:19
 AliRawReaderMemory.cxx:20
 AliRawReaderMemory.cxx:21
 AliRawReaderMemory.cxx:22
 AliRawReaderMemory.cxx:23
 AliRawReaderMemory.cxx:24
 AliRawReaderMemory.cxx:25
 AliRawReaderMemory.cxx:26
 AliRawReaderMemory.cxx:27
 AliRawReaderMemory.cxx:28
 AliRawReaderMemory.cxx:29
 AliRawReaderMemory.cxx:30
 AliRawReaderMemory.cxx:31
 AliRawReaderMemory.cxx:32
 AliRawReaderMemory.cxx:33
 AliRawReaderMemory.cxx:34
 AliRawReaderMemory.cxx:35
 AliRawReaderMemory.cxx:36
 AliRawReaderMemory.cxx:37
 AliRawReaderMemory.cxx:38
 AliRawReaderMemory.cxx:39
 AliRawReaderMemory.cxx:40
 AliRawReaderMemory.cxx:41
 AliRawReaderMemory.cxx:42
 AliRawReaderMemory.cxx:43
 AliRawReaderMemory.cxx:44
 AliRawReaderMemory.cxx:45
 AliRawReaderMemory.cxx:46
 AliRawReaderMemory.cxx:47
 AliRawReaderMemory.cxx:48
 AliRawReaderMemory.cxx:49
 AliRawReaderMemory.cxx:50
 AliRawReaderMemory.cxx:51
 AliRawReaderMemory.cxx:52
 AliRawReaderMemory.cxx:53
 AliRawReaderMemory.cxx:54
 AliRawReaderMemory.cxx:55
 AliRawReaderMemory.cxx:56
 AliRawReaderMemory.cxx:57
 AliRawReaderMemory.cxx:58
 AliRawReaderMemory.cxx:59
 AliRawReaderMemory.cxx:60
 AliRawReaderMemory.cxx:61
 AliRawReaderMemory.cxx:62
 AliRawReaderMemory.cxx:63
 AliRawReaderMemory.cxx:64
 AliRawReaderMemory.cxx:65
 AliRawReaderMemory.cxx:66
 AliRawReaderMemory.cxx:67
 AliRawReaderMemory.cxx:68
 AliRawReaderMemory.cxx:69
 AliRawReaderMemory.cxx:70
 AliRawReaderMemory.cxx:71
 AliRawReaderMemory.cxx:72
 AliRawReaderMemory.cxx:73
 AliRawReaderMemory.cxx:74
 AliRawReaderMemory.cxx:75
 AliRawReaderMemory.cxx:76
 AliRawReaderMemory.cxx:77
 AliRawReaderMemory.cxx:78
 AliRawReaderMemory.cxx:79
 AliRawReaderMemory.cxx:80
 AliRawReaderMemory.cxx:81
 AliRawReaderMemory.cxx:82
 AliRawReaderMemory.cxx:83
 AliRawReaderMemory.cxx:84
 AliRawReaderMemory.cxx:85
 AliRawReaderMemory.cxx:86
 AliRawReaderMemory.cxx:87
 AliRawReaderMemory.cxx:88
 AliRawReaderMemory.cxx:89
 AliRawReaderMemory.cxx:90
 AliRawReaderMemory.cxx:91
 AliRawReaderMemory.cxx:92
 AliRawReaderMemory.cxx:93
 AliRawReaderMemory.cxx:94
 AliRawReaderMemory.cxx:95
 AliRawReaderMemory.cxx:96
 AliRawReaderMemory.cxx:97
 AliRawReaderMemory.cxx:98
 AliRawReaderMemory.cxx:99
 AliRawReaderMemory.cxx:100
 AliRawReaderMemory.cxx:101
 AliRawReaderMemory.cxx:102
 AliRawReaderMemory.cxx:103
 AliRawReaderMemory.cxx:104
 AliRawReaderMemory.cxx:105
 AliRawReaderMemory.cxx:106
 AliRawReaderMemory.cxx:107
 AliRawReaderMemory.cxx:108
 AliRawReaderMemory.cxx:109
 AliRawReaderMemory.cxx:110
 AliRawReaderMemory.cxx:111
 AliRawReaderMemory.cxx:112
 AliRawReaderMemory.cxx:113
 AliRawReaderMemory.cxx:114
 AliRawReaderMemory.cxx:115
 AliRawReaderMemory.cxx:116
 AliRawReaderMemory.cxx:117
 AliRawReaderMemory.cxx:118
 AliRawReaderMemory.cxx:119
 AliRawReaderMemory.cxx:120
 AliRawReaderMemory.cxx:121
 AliRawReaderMemory.cxx:122
 AliRawReaderMemory.cxx:123
 AliRawReaderMemory.cxx:124
 AliRawReaderMemory.cxx:125
 AliRawReaderMemory.cxx:126
 AliRawReaderMemory.cxx:127
 AliRawReaderMemory.cxx:128
 AliRawReaderMemory.cxx:129
 AliRawReaderMemory.cxx:130
 AliRawReaderMemory.cxx:131
 AliRawReaderMemory.cxx:132
 AliRawReaderMemory.cxx:133
 AliRawReaderMemory.cxx:134
 AliRawReaderMemory.cxx:135
 AliRawReaderMemory.cxx:136
 AliRawReaderMemory.cxx:137
 AliRawReaderMemory.cxx:138
 AliRawReaderMemory.cxx:139
 AliRawReaderMemory.cxx:140
 AliRawReaderMemory.cxx:141
 AliRawReaderMemory.cxx:142
 AliRawReaderMemory.cxx:143
 AliRawReaderMemory.cxx:144
 AliRawReaderMemory.cxx:145
 AliRawReaderMemory.cxx:146
 AliRawReaderMemory.cxx:147
 AliRawReaderMemory.cxx:148
 AliRawReaderMemory.cxx:149
 AliRawReaderMemory.cxx:150
 AliRawReaderMemory.cxx:151
 AliRawReaderMemory.cxx:152
 AliRawReaderMemory.cxx:153
 AliRawReaderMemory.cxx:154
 AliRawReaderMemory.cxx:155
 AliRawReaderMemory.cxx:156
 AliRawReaderMemory.cxx:157
 AliRawReaderMemory.cxx:158
 AliRawReaderMemory.cxx:159
 AliRawReaderMemory.cxx:160
 AliRawReaderMemory.cxx:161
 AliRawReaderMemory.cxx:162
 AliRawReaderMemory.cxx:163
 AliRawReaderMemory.cxx:164
 AliRawReaderMemory.cxx:165
 AliRawReaderMemory.cxx:166
 AliRawReaderMemory.cxx:167
 AliRawReaderMemory.cxx:168
 AliRawReaderMemory.cxx:169
 AliRawReaderMemory.cxx:170
 AliRawReaderMemory.cxx:171
 AliRawReaderMemory.cxx:172
 AliRawReaderMemory.cxx:173
 AliRawReaderMemory.cxx:174
 AliRawReaderMemory.cxx:175
 AliRawReaderMemory.cxx:176
 AliRawReaderMemory.cxx:177
 AliRawReaderMemory.cxx:178
 AliRawReaderMemory.cxx:179
 AliRawReaderMemory.cxx:180
 AliRawReaderMemory.cxx:181
 AliRawReaderMemory.cxx:182
 AliRawReaderMemory.cxx:183
 AliRawReaderMemory.cxx:184
 AliRawReaderMemory.cxx:185
 AliRawReaderMemory.cxx:186
 AliRawReaderMemory.cxx:187
 AliRawReaderMemory.cxx:188
 AliRawReaderMemory.cxx:189
 AliRawReaderMemory.cxx:190
 AliRawReaderMemory.cxx:191
 AliRawReaderMemory.cxx:192
 AliRawReaderMemory.cxx:193
 AliRawReaderMemory.cxx:194
 AliRawReaderMemory.cxx:195
 AliRawReaderMemory.cxx:196
 AliRawReaderMemory.cxx:197
 AliRawReaderMemory.cxx:198
 AliRawReaderMemory.cxx:199
 AliRawReaderMemory.cxx:200
 AliRawReaderMemory.cxx:201
 AliRawReaderMemory.cxx:202
 AliRawReaderMemory.cxx:203
 AliRawReaderMemory.cxx:204
 AliRawReaderMemory.cxx:205
 AliRawReaderMemory.cxx:206
 AliRawReaderMemory.cxx:207
 AliRawReaderMemory.cxx:208
 AliRawReaderMemory.cxx:209
 AliRawReaderMemory.cxx:210
 AliRawReaderMemory.cxx:211
 AliRawReaderMemory.cxx:212
 AliRawReaderMemory.cxx:213
 AliRawReaderMemory.cxx:214
 AliRawReaderMemory.cxx:215
 AliRawReaderMemory.cxx:216
 AliRawReaderMemory.cxx:217
 AliRawReaderMemory.cxx:218
 AliRawReaderMemory.cxx:219
 AliRawReaderMemory.cxx:220
 AliRawReaderMemory.cxx:221
 AliRawReaderMemory.cxx:222
 AliRawReaderMemory.cxx:223
 AliRawReaderMemory.cxx:224
 AliRawReaderMemory.cxx:225
 AliRawReaderMemory.cxx:226
 AliRawReaderMemory.cxx:227
 AliRawReaderMemory.cxx:228
 AliRawReaderMemory.cxx:229
 AliRawReaderMemory.cxx:230
 AliRawReaderMemory.cxx:231
 AliRawReaderMemory.cxx:232
 AliRawReaderMemory.cxx:233
 AliRawReaderMemory.cxx:234
 AliRawReaderMemory.cxx:235
 AliRawReaderMemory.cxx:236
 AliRawReaderMemory.cxx:237
 AliRawReaderMemory.cxx:238
 AliRawReaderMemory.cxx:239
 AliRawReaderMemory.cxx:240
 AliRawReaderMemory.cxx:241
 AliRawReaderMemory.cxx:242
 AliRawReaderMemory.cxx:243
 AliRawReaderMemory.cxx:244
 AliRawReaderMemory.cxx:245
 AliRawReaderMemory.cxx:246
 AliRawReaderMemory.cxx:247
 AliRawReaderMemory.cxx:248
 AliRawReaderMemory.cxx:249
 AliRawReaderMemory.cxx:250
 AliRawReaderMemory.cxx:251
 AliRawReaderMemory.cxx:252
 AliRawReaderMemory.cxx:253
 AliRawReaderMemory.cxx:254
 AliRawReaderMemory.cxx:255
 AliRawReaderMemory.cxx:256
 AliRawReaderMemory.cxx:257
 AliRawReaderMemory.cxx:258
 AliRawReaderMemory.cxx:259
 AliRawReaderMemory.cxx:260
 AliRawReaderMemory.cxx:261
 AliRawReaderMemory.cxx:262
 AliRawReaderMemory.cxx:263
 AliRawReaderMemory.cxx:264
 AliRawReaderMemory.cxx:265
 AliRawReaderMemory.cxx:266
 AliRawReaderMemory.cxx:267
 AliRawReaderMemory.cxx:268
 AliRawReaderMemory.cxx:269
 AliRawReaderMemory.cxx:270
 AliRawReaderMemory.cxx:271
 AliRawReaderMemory.cxx:272
 AliRawReaderMemory.cxx:273
 AliRawReaderMemory.cxx:274
 AliRawReaderMemory.cxx:275
 AliRawReaderMemory.cxx:276
 AliRawReaderMemory.cxx:277
 AliRawReaderMemory.cxx:278
 AliRawReaderMemory.cxx:279
 AliRawReaderMemory.cxx:280
 AliRawReaderMemory.cxx:281
 AliRawReaderMemory.cxx:282
 AliRawReaderMemory.cxx:283
 AliRawReaderMemory.cxx:284
 AliRawReaderMemory.cxx:285
 AliRawReaderMemory.cxx:286
 AliRawReaderMemory.cxx:287
 AliRawReaderMemory.cxx:288
 AliRawReaderMemory.cxx:289
 AliRawReaderMemory.cxx:290
 AliRawReaderMemory.cxx:291
 AliRawReaderMemory.cxx:292
 AliRawReaderMemory.cxx:293
 AliRawReaderMemory.cxx:294
 AliRawReaderMemory.cxx:295
 AliRawReaderMemory.cxx:296
 AliRawReaderMemory.cxx:297
 AliRawReaderMemory.cxx:298
 AliRawReaderMemory.cxx:299
 AliRawReaderMemory.cxx:300
 AliRawReaderMemory.cxx:301
 AliRawReaderMemory.cxx:302
 AliRawReaderMemory.cxx:303
 AliRawReaderMemory.cxx:304
 AliRawReaderMemory.cxx:305
 AliRawReaderMemory.cxx:306
 AliRawReaderMemory.cxx:307
 AliRawReaderMemory.cxx:308
 AliRawReaderMemory.cxx:309
 AliRawReaderMemory.cxx:310
 AliRawReaderMemory.cxx:311
 AliRawReaderMemory.cxx:312
 AliRawReaderMemory.cxx:313
 AliRawReaderMemory.cxx:314
 AliRawReaderMemory.cxx:315
 AliRawReaderMemory.cxx:316
 AliRawReaderMemory.cxx:317
 AliRawReaderMemory.cxx:318
 AliRawReaderMemory.cxx:319
 AliRawReaderMemory.cxx:320
 AliRawReaderMemory.cxx:321
 AliRawReaderMemory.cxx:322
 AliRawReaderMemory.cxx:323
 AliRawReaderMemory.cxx:324
 AliRawReaderMemory.cxx:325