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   AliHLTMemoryFile.cxx
    @author Matthias Richter
    @date   
    @brief  ROOT file in memory.                                          */

#include "AliHLTMemoryFile.h"
#include <cerrno>

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

AliHLTMemoryFile::AliHLTMemoryFile()
  :
  fpBuffer(NULL),
  fBufferSize(0),
  fPosition(0),
  fSize(0),
  fErrno(0),
  fbClosed(0),
  fHeaderSize(0),
  fTrailerSize(0)
{
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
}

AliHLTMemoryFile::AliHLTMemoryFile(void* pBuffer, int iSize)
  :
  TFile("/dev/null", "CREATE"),
  AliHLTLogging(),
  fpBuffer((char*)pBuffer),
  fBufferSize(iSize),
  fPosition(0),
  fSize(0),
  fErrno(0),
  fbClosed(0),
  fHeaderSize(0),
  fTrailerSize(0)
{
  // see header file for class documentation
  //HLTDebug("created memory file %p, capacity %d, ROOT version %d", this, fBufferSize, fVersion);
}

AliHLTMemoryFile::~AliHLTMemoryFile()
{
  // see header file for function documentation
  //HLTDebug("deleting file %p size %d", this, fSize);
  if (!fbClosed) {
    HLTWarning("memory file not closed, possible data loss");
  }
}

void AliHLTMemoryFile::Close(const Option_t*)
{
  CloseMemoryFile();
}

int AliHLTMemoryFile::CloseMemoryFile(int bFlush)
{
  fErrno=0;
  if (fbClosed) return 0;
  if (bFlush) {
    TFile::Close();
  }
  fpBuffer=NULL;
  fBufferSize=fPosition=0;
  fbClosed=1;
  if (fErrno==ENOSPC) {
    HLTError("error flushing memory file, buffer too small");
  } else if (fErrno>0) {
    HLTError("error flushing memory file");
  }
  return -fErrno;
}

Int_t    AliHLTMemoryFile::SysOpen(const char* /*pathname*/, Int_t /*flags*/, UInt_t /*mode*/)
{
  // see header file for function documentation
  if (fpBuffer==NULL || fSize==0) return 1;
  //HLTDebug("opening file %p capacity %d", this, fSize);
  fErrno=0;
  errno=fErrno=ENOSPC;
  return -1;
}

Int_t    AliHLTMemoryFile::SysClose(Int_t /*fd*/)
{
  // see header file for function documentation
  //HLTDebug("closing file %p size %d", this, fSize);
  return 0;
}

Int_t    AliHLTMemoryFile::SysRead(Int_t /*fd*/, void *buf, Int_t len)
{
  // see header file for function documentation
  if (buf==NULL) return 0;
  fErrno=0;
  //HLTDebug("reading buffer of size %d at position %d", len, fPosition);
  if (fpBuffer==NULL || fBufferSize==0) return 0;
  int read=len<fSize-fPosition?len:fSize-fPosition;
  memcpy(buf, fpBuffer+fPosition, read);
  fPosition+=read;
  if (fPosition>=fSize) fSize=fPosition+1;
  return read;
}

Int_t    AliHLTMemoryFile::SysWrite(Int_t /*fd*/, const void *buf, Int_t len)
{
  // see header file for function documentation
  if (buf==NULL) return 0;
  fErrno=0;
  //HLTDebug("writing buffer of size %d at position %d", len, fPosition);
  if (len<fBufferSize-fPosition) {
    memcpy(fpBuffer+fPosition, buf, len);
    fPosition+=len;
    if (fPosition>=fSize) fSize=fPosition+1;
    return len;
  }
  errno=fErrno=ENOSPC;
  return -1;
}

Long64_t AliHLTMemoryFile::SysSeek(Int_t /*fd*/, Long64_t offset, Int_t whence)
{
  // see header file for function documentation
  //HLTDebug("seek %d from %d", offset, whence);
  fErrno=0;
  int position=(int)offset;
  switch (whence) {
  case SEEK_SET:
    // nothing to do
    break;
  case SEEK_CUR:
    position+=fPosition;
    break;
  case SEEK_END:
    position+=fSize;
    break;
  default:
    position=-1;
    errno=EINVAL;
  }
  if (position>=0) {
    if (position<fBufferSize) {
      fPosition=position;
    } else {
      position=-1;
      errno=fErrno=ENOSPC;
    }
  }
  return position;
}

Int_t    AliHLTMemoryFile::SysStat(Int_t /*fd*/, Long_t */*id*/, Long64_t *size, Long_t */*flags*/, Long_t */*modtime*/)
{
  // see header file for function documentation
  if (size) *size=fSize;
  return 0;
}

Int_t    AliHLTMemoryFile::SysSync(Int_t /*fd*/)
{
  // see header file for function documentation
  return 0;
}

int AliHLTMemoryFile::WriteHeaderBuffer(const char* pHeader, int size)
{
  // see header file for function documentation
  fErrno=0;
  if (fHeaderSize==0) {
    if (fSize+size<fBufferSize) {
      if (fSize>0) {
	// move exiting data
	memcpy(fpBuffer+size, fpBuffer, fSize);
      }
      memcpy(fpBuffer, pHeader, size);
      fpBuffer+=size;
      fPosition+=size;
      fBufferSize-=size;
      fHeaderSize=size;
    } else {
      HLTError("no space left in memory file");
      fErrno=ENOSPC;
    }
  } else {
    HLTError("header exists");
    fErrno=EEXIST;
  }
  return -fErrno;
}

// int AliHLTMemoryFile::WriteTrailerBuffer(const char* pTrailer, int size)
// {
//   // see header file for function documentation
//   fErrno=0;
//   if (fD>0) {
//     HLTError("file must be closed to write trailer");
//     return EPERM;
//   }
//   if (fSize+size<fBufferSize) {
//     memcpy(fpBuffer+fSize, pTrailer, size);
//   } else {
//     HLTError("no space left in memory file");
//     fErrno=ENOSPC;
//   }
//   return fErrno;
// }
 AliHLTMemoryFile.cxx:1
 AliHLTMemoryFile.cxx:2
 AliHLTMemoryFile.cxx:3
 AliHLTMemoryFile.cxx:4
 AliHLTMemoryFile.cxx:5
 AliHLTMemoryFile.cxx:6
 AliHLTMemoryFile.cxx:7
 AliHLTMemoryFile.cxx:8
 AliHLTMemoryFile.cxx:9
 AliHLTMemoryFile.cxx:10
 AliHLTMemoryFile.cxx:11
 AliHLTMemoryFile.cxx:12
 AliHLTMemoryFile.cxx:13
 AliHLTMemoryFile.cxx:14
 AliHLTMemoryFile.cxx:15
 AliHLTMemoryFile.cxx:16
 AliHLTMemoryFile.cxx:17
 AliHLTMemoryFile.cxx:18
 AliHLTMemoryFile.cxx:19
 AliHLTMemoryFile.cxx:20
 AliHLTMemoryFile.cxx:21
 AliHLTMemoryFile.cxx:22
 AliHLTMemoryFile.cxx:23
 AliHLTMemoryFile.cxx:24
 AliHLTMemoryFile.cxx:25
 AliHLTMemoryFile.cxx:26
 AliHLTMemoryFile.cxx:27
 AliHLTMemoryFile.cxx:28
 AliHLTMemoryFile.cxx:29
 AliHLTMemoryFile.cxx:30
 AliHLTMemoryFile.cxx:31
 AliHLTMemoryFile.cxx:32
 AliHLTMemoryFile.cxx:33
 AliHLTMemoryFile.cxx:34
 AliHLTMemoryFile.cxx:35
 AliHLTMemoryFile.cxx:36
 AliHLTMemoryFile.cxx:37
 AliHLTMemoryFile.cxx:38
 AliHLTMemoryFile.cxx:39
 AliHLTMemoryFile.cxx:40
 AliHLTMemoryFile.cxx:41
 AliHLTMemoryFile.cxx:42
 AliHLTMemoryFile.cxx:43
 AliHLTMemoryFile.cxx:44
 AliHLTMemoryFile.cxx:45
 AliHLTMemoryFile.cxx:46
 AliHLTMemoryFile.cxx:47
 AliHLTMemoryFile.cxx:48
 AliHLTMemoryFile.cxx:49
 AliHLTMemoryFile.cxx:50
 AliHLTMemoryFile.cxx:51
 AliHLTMemoryFile.cxx:52
 AliHLTMemoryFile.cxx:53
 AliHLTMemoryFile.cxx:54
 AliHLTMemoryFile.cxx:55
 AliHLTMemoryFile.cxx:56
 AliHLTMemoryFile.cxx:57
 AliHLTMemoryFile.cxx:58
 AliHLTMemoryFile.cxx:59
 AliHLTMemoryFile.cxx:60
 AliHLTMemoryFile.cxx:61
 AliHLTMemoryFile.cxx:62
 AliHLTMemoryFile.cxx:63
 AliHLTMemoryFile.cxx:64
 AliHLTMemoryFile.cxx:65
 AliHLTMemoryFile.cxx:66
 AliHLTMemoryFile.cxx:67
 AliHLTMemoryFile.cxx:68
 AliHLTMemoryFile.cxx:69
 AliHLTMemoryFile.cxx:70
 AliHLTMemoryFile.cxx:71
 AliHLTMemoryFile.cxx:72
 AliHLTMemoryFile.cxx:73
 AliHLTMemoryFile.cxx:74
 AliHLTMemoryFile.cxx:75
 AliHLTMemoryFile.cxx:76
 AliHLTMemoryFile.cxx:77
 AliHLTMemoryFile.cxx:78
 AliHLTMemoryFile.cxx:79
 AliHLTMemoryFile.cxx:80
 AliHLTMemoryFile.cxx:81
 AliHLTMemoryFile.cxx:82
 AliHLTMemoryFile.cxx:83
 AliHLTMemoryFile.cxx:84
 AliHLTMemoryFile.cxx:85
 AliHLTMemoryFile.cxx:86
 AliHLTMemoryFile.cxx:87
 AliHLTMemoryFile.cxx:88
 AliHLTMemoryFile.cxx:89
 AliHLTMemoryFile.cxx:90
 AliHLTMemoryFile.cxx:91
 AliHLTMemoryFile.cxx:92
 AliHLTMemoryFile.cxx:93
 AliHLTMemoryFile.cxx:94
 AliHLTMemoryFile.cxx:95
 AliHLTMemoryFile.cxx:96
 AliHLTMemoryFile.cxx:97
 AliHLTMemoryFile.cxx:98
 AliHLTMemoryFile.cxx:99
 AliHLTMemoryFile.cxx:100
 AliHLTMemoryFile.cxx:101
 AliHLTMemoryFile.cxx:102
 AliHLTMemoryFile.cxx:103
 AliHLTMemoryFile.cxx:104
 AliHLTMemoryFile.cxx:105
 AliHLTMemoryFile.cxx:106
 AliHLTMemoryFile.cxx:107
 AliHLTMemoryFile.cxx:108
 AliHLTMemoryFile.cxx:109
 AliHLTMemoryFile.cxx:110
 AliHLTMemoryFile.cxx:111
 AliHLTMemoryFile.cxx:112
 AliHLTMemoryFile.cxx:113
 AliHLTMemoryFile.cxx:114
 AliHLTMemoryFile.cxx:115
 AliHLTMemoryFile.cxx:116
 AliHLTMemoryFile.cxx:117
 AliHLTMemoryFile.cxx:118
 AliHLTMemoryFile.cxx:119
 AliHLTMemoryFile.cxx:120
 AliHLTMemoryFile.cxx:121
 AliHLTMemoryFile.cxx:122
 AliHLTMemoryFile.cxx:123
 AliHLTMemoryFile.cxx:124
 AliHLTMemoryFile.cxx:125
 AliHLTMemoryFile.cxx:126
 AliHLTMemoryFile.cxx:127
 AliHLTMemoryFile.cxx:128
 AliHLTMemoryFile.cxx:129
 AliHLTMemoryFile.cxx:130
 AliHLTMemoryFile.cxx:131
 AliHLTMemoryFile.cxx:132
 AliHLTMemoryFile.cxx:133
 AliHLTMemoryFile.cxx:134
 AliHLTMemoryFile.cxx:135
 AliHLTMemoryFile.cxx:136
 AliHLTMemoryFile.cxx:137
 AliHLTMemoryFile.cxx:138
 AliHLTMemoryFile.cxx:139
 AliHLTMemoryFile.cxx:140
 AliHLTMemoryFile.cxx:141
 AliHLTMemoryFile.cxx:142
 AliHLTMemoryFile.cxx:143
 AliHLTMemoryFile.cxx:144
 AliHLTMemoryFile.cxx:145
 AliHLTMemoryFile.cxx:146
 AliHLTMemoryFile.cxx:147
 AliHLTMemoryFile.cxx:148
 AliHLTMemoryFile.cxx:149
 AliHLTMemoryFile.cxx:150
 AliHLTMemoryFile.cxx:151
 AliHLTMemoryFile.cxx:152
 AliHLTMemoryFile.cxx:153
 AliHLTMemoryFile.cxx:154
 AliHLTMemoryFile.cxx:155
 AliHLTMemoryFile.cxx:156
 AliHLTMemoryFile.cxx:157
 AliHLTMemoryFile.cxx:158
 AliHLTMemoryFile.cxx:159
 AliHLTMemoryFile.cxx:160
 AliHLTMemoryFile.cxx:161
 AliHLTMemoryFile.cxx:162
 AliHLTMemoryFile.cxx:163
 AliHLTMemoryFile.cxx:164
 AliHLTMemoryFile.cxx:165
 AliHLTMemoryFile.cxx:166
 AliHLTMemoryFile.cxx:167
 AliHLTMemoryFile.cxx:168
 AliHLTMemoryFile.cxx:169
 AliHLTMemoryFile.cxx:170
 AliHLTMemoryFile.cxx:171
 AliHLTMemoryFile.cxx:172
 AliHLTMemoryFile.cxx:173
 AliHLTMemoryFile.cxx:174
 AliHLTMemoryFile.cxx:175
 AliHLTMemoryFile.cxx:176
 AliHLTMemoryFile.cxx:177
 AliHLTMemoryFile.cxx:178
 AliHLTMemoryFile.cxx:179
 AliHLTMemoryFile.cxx:180
 AliHLTMemoryFile.cxx:181
 AliHLTMemoryFile.cxx:182
 AliHLTMemoryFile.cxx:183
 AliHLTMemoryFile.cxx:184
 AliHLTMemoryFile.cxx:185
 AliHLTMemoryFile.cxx:186
 AliHLTMemoryFile.cxx:187
 AliHLTMemoryFile.cxx:188
 AliHLTMemoryFile.cxx:189
 AliHLTMemoryFile.cxx:190
 AliHLTMemoryFile.cxx:191
 AliHLTMemoryFile.cxx:192
 AliHLTMemoryFile.cxx:193
 AliHLTMemoryFile.cxx:194
 AliHLTMemoryFile.cxx:195
 AliHLTMemoryFile.cxx:196
 AliHLTMemoryFile.cxx:197
 AliHLTMemoryFile.cxx:198
 AliHLTMemoryFile.cxx:199
 AliHLTMemoryFile.cxx:200
 AliHLTMemoryFile.cxx:201
 AliHLTMemoryFile.cxx:202
 AliHLTMemoryFile.cxx:203
 AliHLTMemoryFile.cxx:204
 AliHLTMemoryFile.cxx:205
 AliHLTMemoryFile.cxx:206
 AliHLTMemoryFile.cxx:207
 AliHLTMemoryFile.cxx:208
 AliHLTMemoryFile.cxx:209
 AliHLTMemoryFile.cxx:210
 AliHLTMemoryFile.cxx:211
 AliHLTMemoryFile.cxx:212
 AliHLTMemoryFile.cxx:213
 AliHLTMemoryFile.cxx:214
 AliHLTMemoryFile.cxx:215
 AliHLTMemoryFile.cxx:216
 AliHLTMemoryFile.cxx:217
 AliHLTMemoryFile.cxx:218
 AliHLTMemoryFile.cxx:219
 AliHLTMemoryFile.cxx:220
 AliHLTMemoryFile.cxx:221
 AliHLTMemoryFile.cxx:222
 AliHLTMemoryFile.cxx:223
 AliHLTMemoryFile.cxx:224
 AliHLTMemoryFile.cxx:225
 AliHLTMemoryFile.cxx:226
 AliHLTMemoryFile.cxx:227
 AliHLTMemoryFile.cxx:228
 AliHLTMemoryFile.cxx:229