24 #include "TBufferFile.h"
32 #include "dabc/version.h"
33 #include "dabc/Hierarchy.h"
34 #include "dabc/Manager.h"
35 #include "dabc/Publisher.h"
36 #include "dabc/Configuration.h"
38 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,12,0)
41 extern "C" int R__unzip_header(
int *nin,
unsigned char *bufin,
int *lout);
42 extern "C" void R__unzip(
int *nin,
unsigned char* bufin,
int *lout,
unsigned char *bufout,
int *nout);
47 if ((item.GetField(
"dabc:kind").AsStr() ==
"rate") ||
48 (item.GetField(
"dabc:history").AsInt() > 0))
return kTRUE;
54 std::string kind = item.GetField(
"dabc:kind").AsStr();
55 if (kind.find(
"ROOT.") == 0) {
69 #if ROOT_VERSION_CODE > ROOT_VERSION(6,14,4)
71 InfoListRet GetStreamerInfoListImpl(
bool)
override
73 ROOT::Internal::RConcurrentHashColl::HashValue hash;
74 return { (TList*) mylist->Clone(), 0, hash};
83 TFakeFile(TList *sinfo) : TMemFile(
"dummy.file",
"RECREATE"), mylist(sinfo)
85 gROOT->GetListOfFiles()->Remove(
this);
125 fObjName =
"StreamerInfo";
126 fItemName = sinfoname;
127 fRootClassName =
"TList";
148 fObjName = item.GetName();
149 fItemName = item.ItemName();
150 std::string kind = item.GetField(dabc::prop_kind).AsStr();
151 fHistoryLength = item.GetField(dabc::prop_history).AsInt();
153 fMasterName = item.GetField(dabc::prop_masteritem).AsStr();
154 fMasterItemName = item.FindMaster().ItemName();
156 if (kind.find(
"ROOT.") == 0) {
158 fRootClassName = kind;
162 if (fHistoryLength > 0) fRootClassName =
"TGraph";
177 virtual Bool_t
GetObject(TObject* &obj, Bool_t &owner)
const {
return kFALSE; }
181 if (fRootClassName.length() > 0)
188 return fObjName.c_str();
193 if (fRootClassName.length()>0)
return fRootClassName.c_str();
195 return "dabc::Hierarchy";
201 if (rcv==0)
return 0;
203 dabc::WorkerRef wrk = dabc::mgr.FindItem(
"/Go4ReplWrk");
204 if (wrk.null())
return 0;
206 if (fIsRate && (fHistoryLength>0)) {
207 dabc::CmdGetBinary cmd2;
208 cmd2.SetStr(
"Item", fItemName);
209 cmd2.SetStr(
"Kind",
"hierarchy");
210 cmd2.SetStr(
"Query", Form(
"history=%d",fHistoryLength));
211 cmd2.SetTimeout(10.);
212 cmd2.SetReceiver(fNodeName + dabc::Publisher::DfltName());
214 cmd2.SetPtr(
"#DabcAccess",
this);
219 if (dabc::mgr.GetCommandChannel().Submit(cmd2))
return 2;
222 if (!fRootClassName.empty()) {
224 TClass *cl = TClass::GetClass(fRootClassName.c_str());
226 TGo4Log::Error(
"GetObject Unknown class %s", fRootClassName.c_str());
230 if (!cl->InheritsFrom(TObject::Class())) {
232 TGo4Log::Error(
"GetObject Class %s not derived from TObject", fRootClassName.c_str());
236 dabc::CmdGetBinary cmd(fItemName,
"root.bin", fCompression ?
"zipped" :
"");
240 cmd.SetReceiver(fNodeName + dabc::Publisher::DfltName());
242 cmd.SetPtr(
"#DabcAccess",
this);
249 if (dabc::mgr.GetCommandChannel().Submit(cmd))
return 2;
260 if (cmd.GetResult() != dabc::cmd_true) {
261 TGo4Log::Error(
"dabc::Command %s execution failed", cmd.GetName());
266 fRawData = cmd.GetRawData();
268 if (fRawData.null() || (fRawData.NumSegments()==0)) {
269 TGo4Log::Error(
"Did not get raw data from dabc::Command %s", cmd.GetName());
273 if (fIsRate && (fHistoryLength>0)) {
276 res.SetVersion(cmd.GetUInt(
"version"));
277 res.ReadFromBuffer(fRawData);
281 dabc::HistoryIter iter = res.MakeHistoryIter();
283 while (iter.next()) cnt++;
287 if (cnt==0)
return kFALSE;
289 TGraph* gr =
new TGraph(cnt);
290 gr->SetName(fObjName.c_str());
291 gr->SetTitle(Form(
"%s ratemeter", fItemName.c_str()));
293 while (iter.next()) {
295 double v = iter.GetField(
"value").AsDouble();
296 uint64_t tm = iter.GetField(
"time").AsUInt();
301 gr->SetPoint(cnt-i, tm / 1000, v);
304 gr->GetXaxis()->SetTimeDisplay(1);
305 gr->GetXaxis()->SetTimeFormat(
"%H:%M:%S%F1970-01-01 00:00:00");
311 if (!fRootClassName.empty()) {
312 TClass *cl = TClass::GetClass(fRootClassName.c_str());
320 if (!fMasterName.empty() && tgtslot && tgtslot->GetParent())
326 Int_t local_master_version = 0;
328 if (!masterslot->
GetIntPar(
"dabc_version", local_master_version))
329 local_master_version = 0;
331 if (local_master_version >= cmd.GetInt(
"MVersion")) {
334 if (masterslot->
GetPar(
"dabc_loading")!=0) {
343 TGo4Log::Error(
"Fail to request MASTER item %s from DABC node %s", fMasterItemName.c_str(), fNodeName.c_str());
347 masterslot->
SetPar(
"dabc_loading",
"true");
352 TGo4Log::Debug(
"Item %s raw_data size %u master_version %u", fItemName.c_str(), fRawData.GetTotalSize(), cmd.GetInt(
"MVersion"));
354 char *pobj = (
char*) cl->New();
357 TGo4Log::Error(
"ReadObj - Cannot create new object of class %s", cl->GetName());
361 Int_t baseOffset = cl->GetBaseClassOffset(TObject::Class());
362 if (baseOffset==-1) {
366 TGo4Log::Error(
"ReadObj Incorrect detection of the inheritance from TObject for class %s.",
371 TObject *tobj = (TObject*)(pobj+baseOffset);
379 int sizeinp(fRawData.GetTotalSize()), sizeout(0), irep(0);
381 if (R__unzip_header(&sizeinp, (
unsigned char*) fRawData.SegmentPtr(), &sizeout)) {
382 printf(
"Fail to decode zip header\n");
384 rawbuf = (
char*) malloc(sizeout);
386 R__unzip(&sizeinp, (
unsigned char*) fRawData.SegmentPtr(), &sizeout, (
unsigned char*) rawbuf, &irep);
391 rawbuf = (
char*) fRawData.SegmentPtr();
392 rawbuflen = fRawData.GetTotalSize();
396 TBufferFile buf(TBuffer::kRead, rawbuflen, rawbuf, kFALSE);
397 buf.MapObject(pobj,cl);
400 cl->Destructor(pobj);
405 if (fCompression) free(rawbuf);
407 if ((fObjName ==
"StreamerInfo") &&
408 (fRootClassName ==
"TList") &&
409 tobj && tobj->InheritsFrom(TList::Class()) &&
410 fMasterName.empty()) {
413 fff.ReadStreamerInfo();
420 tgtslot->RemovePar(
"dabc_loading");
421 tgtslot->SetIntPar(
"dabc_version", cmd.GetInt(
"BVersion"));
477 Start((Long_t)res_tm*1000, kTRUE);
487 if ((cmd.GetPtr(
"#DabcAccess") != 0) || (cmd.GetPtr(
"#DabcProxy") != 0)) {
493 return dabc::Worker::ReplyCommand(cmd);
498 dabc::Worker(MakePair(name))
528 if (fParent.NumChilds()==0)
return kFALSE;
532 fChild = fParent.GetChild(fCnt);
537 if (fCnt>=fParent.NumChilds())
return kFALSE;
538 fChild = fParent.GetChild(fCnt);
542 return !fChild.null();
545 virtual Bool_t
isfolder() {
return fChild.NumChilds()>0; }
549 if (strcmp(flagname,
"IsRemote")==0)
return 1;
560 virtual const char*
name() {
return fChild.GetName(); }
561 virtual const char*
info() {
return "item from dabc"; }
582 if (fClNameBuf.Length()>0)
return fClNameBuf.Data();
584 return "dabc::Hierarchy";
615 if (!dabc::CreateManager(
"cmd", 0))
return kFALSE;
617 std::string node = dabc::MakeNodeName(nodename);
619 if (!dabc::ConnectDabcNode(node)) {
624 dabc::WorkerRef wrk = dabc::mgr.FindItem(
"/Go4ReplWrk");
628 wrk()->AssignToThread(dabc::mgr.thread());
640 dabc::Command cmd = *((dabc::Command*)_cmd);
642 if (cmd.IsName(dabc::CmdGetNamesList::CmdName())) {
644 dabc::Buffer buf = cmd.GetRawData();
646 if (buf.null())
return kFALSE;
652 dabc::Hierarchy& hierarchy = *((dabc::Hierarchy*)
fxHierarchy);
656 if (!hierarchy.ReadFromBuffer(buf))
return kFALSE;
669 if (
fNodeName.Length() == 0)
return kFALSE;
671 dabc::CmdGetNamesList cmd2;
672 cmd2.SetReceiver(std::string(
fNodeName.Data()) + dabc::Publisher::DfltName());
673 cmd2.SetTimeout(10.);
675 dabc::WorkerRef wrk = dabc::mgr.FindItem(
"/Go4ReplWrk");
677 if (!sync && !wrk.null()) {
678 cmd2.SetPtr(
"#DabcProxy",
this);
681 dabc::mgr.GetCommandChannel().Submit(cmd2);
685 if (dabc::mgr.GetCommandChannel().Execute(cmd2)!=dabc::cmd_true) {
706 dabc::Hierarchy& hierarchy = *((dabc::Hierarchy*)
fxHierarchy);
708 return hierarchy.NumChilds() > 0;
717 dabc::Hierarchy& hierarchy = *((dabc::Hierarchy*)
fxHierarchy);
719 if (hierarchy.null())
return 0;
721 if ((name==0) || (strlen(name)==0)) {
726 dabc::Hierarchy child = hierarchy.FindChild(name);
737 dabc::Hierarchy& hierarchy = *((dabc::Hierarchy*)
fxHierarchy);
755 printf(
"GO4 WANTS update DABC hierarchy - do it\n");
Bool_t Connect(const char *nodename)
virtual const char * GetObjectName() const
Bool_t GetIntPar(const char *name, Int_t &value)
static TClass * GetClass(const char *classname, Bool_t load=kFALSE)
Bool_t UpdateHierarchy(Bool_t sync=kTRUE)
TGo4DabcAccess(const std::string &node, const dabc::Hierarchy &item)
TGo4DabcAccess(const std::string &node, const std::string &sinfoname)
request compression from server
virtual ~TGo4DabcLevelIter()
ReplyWorker(const std::string &name)
TGo4Slot * FindSlot(const char *fullpath, const char **subname=0)
std::string fMasterItemName
unsigned fCnt
buffer used for class name
virtual void Update(TGo4Slot *slot, Bool_t strong)
virtual TGo4LevelIter * subiterator()
void DoObjectAssignement(TGo4ObjectManager *rcv, const char *path, TObject *obj, Bool_t owner)
virtual Int_t AssignObjectTo(TGo4ObjectManager *rcv, const char *path)
const char * GetPar(const char *name) const
Bool_t fCompression
raw data, get from command
virtual const char * info()
virtual ~TGo4DabcAccess()
virtual Bool_t RefreshNamesList()
TGo4DabcLevelIter(const dabc::Hierarchy &item)
virtual TList * GetStreamerInfoList()
virtual void Initialize(TGo4Slot *slot)
virtual void Finalize(TGo4Slot *slot)
TString GetRootClassName(const dabc::Hierarchy &item)
virtual Bool_t isfolder()
TGo4Slot * GetParent() const
std::string fRootClassName
TGo4Slot * GetSlot(const char *name, Bool_t force=kFALSE)
virtual bool ReplyCommand(dabc::Command cmd)
TReplyTimer(dabc::Command cmd)
virtual const char * GetObjectClassName() const
virtual const char * name()
double ProcessCommandReply(dabc::Command cmd)
virtual Int_t getflag(const char *flagname)
virtual TGo4LevelIter * MakeIter()
virtual void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs)
virtual Bool_t CanGetObject() const
TGo4ObjectManager * fxReceiver
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=0)
virtual const char * GetClassName()
Int_t AssignObjectToSlot(TGo4Slot *slot)
Bool_t ReplyCommand(void *cmd)
virtual TClass * GetObjectClass() const
virtual TGo4Slot * getslot()
bool IsRateHistory(const dabc::Hierarchy &item)
static const char * GetDabcVersion()
virtual Bool_t GetObject(TObject *&obj, Bool_t &owner) const
virtual Bool_t HasSublevels() const
virtual TGo4Access * ProvideAccess(const char *name)
TGo4Slot * fxParentSlot
pointer on dabc::Hierarchy class
void SetPar(const char *name, const char *value)
virtual void ReadData(TGo4Slot *slot, TDirectory *dir)
static void Error(const char *text,...)
static void Debug(const char *text,...)
virtual Bool_t IsRemote() const