// =====================================================================
//  $Id: TInputObjectFileOnline.cc,v 1.4 2004/03/07 10:30:32 goiwai Exp $
//  $Name: CLDAQ-1-14-06 $
//  $Log: TInputObjectFileOnline.cc,v $
//  Revision 1.4  2004/03/07 10:30:32  goiwai
//  ROOTに組みこむためのおまじないマクロを埋めこみました。
//  全てにおいて完全に動作するわけではありません。
//
//  Revision 1.3  2003/12/06 10:56:19  goiwai
//  フィルタ関連の修整と Read(),Write()の戻り値の修整です.
//  Read()もWrite()も処理したレコードサイズを返します.
//  フィルタがある場合も同様です.
//  それぞれのストリームのDataSizeの扱いですが,これは扱ったレコードサイズ
//  でなく扱ったファイルやソケットなどのサイズになります.レコードサイズと
//  一致するとは限りません.
//
//  Revision 1.2  2003/10/14 22:05:35  goiwai
//  やたら落ちるのとCPU食いまくるので,usleep(100*1000)するようにしました.
//  やっぱレコードにステータス持たせないとだめですね.以下,提案：
//  8bit:	status
//  32bit:	total size
//
//  Revision 1.1  2003/10/12 13:01:47  goiwai
//  オンラインでファイルを見ることが多いのでオンライン用のものを用意しまし
//  た.1イベント読むことに成功するまで Read() メンバ関数から戻ってきません
//  ので,終了時には レコードID を見てループから抜ける必要があります.
//  データフォーマットにステータス持たせればこの必要はなかったんですが.
//
// =====================================================================
#include "TInputObjectFileOnline.hh"
#include "TStreamableObject.hh"
#include "TDataRecord.hh"
#include "TDataSection.hh"
#include "TDataSegment.hh"
#include "TDataElement.hh"
#include "TInputObjectFilter.hh"
#include "TFileProperty.hh"

TInputObjectFileOnline::TInputObjectFileOnline( const Tstring& filename, const Tstring& mode, Tint utime )
  : TInputObjectFile( filename, mode ),
    theMicroSleepTime( utime )
{;}

TInputObjectFileOnline::TInputObjectFileOnline( TInputObjectFilter* filter, const Tstring& filename, const Tstring& mode, Tint utime )
  : TInputObjectFile( filter, filename, mode ),
    theMicroSleepTime( utime )
{;}

TInputObjectFileOnline::~TInputObjectFileOnline()
{;}

Tint TInputObjectFileOnline::Read( TStreamableObject& object )
{
  if ( HasFilter() ) {
    return theObjectFilter -> Filtering( object, this );
  }  

  theLastDataSize = theDataSize;
  theDataSize = 0;

  static Tobject_t objecttype = object.GetObjectType();

  switch ( objecttype ) {
    case tObjectDataRecord:
      *( (TDataRecord*)(&object) ) = getDataRecord();
      break;
    case tObjectDataSection:
      *( (TDataSection*)(&object) ) = getDataSection();
      break;
    case tObjectDataSegment:
      *( (TDataSegment*)(&object) ) = getDataSegment();
      break;
    case tObjectDataElement:
      *( (TDataElement*)(&object) ) = getDataElement();
      break;
    default:
      break;
  }

  if ( theDataSize <= 0 ) {
    SetOffset( theTotalDataSize, TObjectFile::tSeekBegin );
    TFileProperty pp( theFileName );
    Tint ss = pp.GetTotalSize();
    while ( ss == pp.GetTotalSize() ) {
      MicroSleep();
      pp.Update();
    }
    Read( object );
  } else {
    theTotalDataSize += theDataSize;
  }

  return theDataSize;
}

#ifdef __CLDAQ_ROOT_DLL
    ClassImp(TInputObjectFileOnline)
#endif
