#include "TMessageHandler.h"
#include "TClass.h"
#include "TROOT.h"
#include "TVirtualMutex.h"
ClassImp(TMessageHandler)
TMessageHandler::TMessageHandler(const TClass *cl, Bool_t derived)
{
fClass = cl;
fMessObj = 0;
fMessId = 0;
fSize = 0;
fCnts = 0;
fMessIds = 0;
fDerived = derived;
if (fClass) SetName(fClass->GetName());
else SetName("DefaultMessageHandler");
Add();
}
TMessageHandler::TMessageHandler(const char *cl, Bool_t derived)
{
fClass = TClass::GetClass(cl);
fMessObj = 0;
fMessId = 0;
fSize = 0;
fCnts = 0;
fMessIds = 0;
fDerived = derived;
SetName(cl);
SetName(fClass->GetName());
Add();
}
TMessageHandler:: ~TMessageHandler()
{
Remove();
if (fSize <= 0) return;
delete [] fCnts;
delete [] fMessIds;
}
void TMessageHandler::Add()
{
R__LOCKGUARD2(gROOTMutex);
gROOT->GetListOfMessageHandlers()->Add(this);
}
Int_t TMessageHandler::GetMessageCount(Int_t messId) const
{
if (fSize <= 0) return 0;
for (Int_t i=0;i<fSize;i++) {
if (fMessIds[i] == messId) return fCnts[i];
}
return 0;
}
Int_t TMessageHandler::GetTotalMessageCount() const
{
if (fSize <= 0) return 0;
Int_t count = 0;
for (Int_t i=0;i<fSize;i++) {
count += fCnts[i];
}
return count;
}
void TMessageHandler::HandleMessage(Int_t id, const TObject *obj)
{
if (fClass) {
if (fDerived) {
if(!obj->InheritsFrom(fClass)) return;
} else {
if (obj->IsA() != fClass) return;
}
}
fMessId = id;
fMessObj = obj;
Notify();
Int_t i;
if (fSize <=0) {
fSize = 1;
fCnts = new Int_t[fSize];
fMessIds = new Int_t[fSize];
} else {
for (i=0;i<fSize;i++) {
if (fMessIds[i] == fMessId) {
fCnts[i]++;
return;
}
}
fSize++;
Int_t *newCnts = new Int_t[fSize];
Int_t *newMessIds = new Int_t[fSize];
for (i=0;i<fSize-1;i++) {
newCnts[i] = fCnts[i];
newMessIds[i] = fMessIds[i];
}
delete [] fCnts;
delete [] fMessIds;
fCnts = newCnts;
fMessIds = newMessIds;
}
fCnts[fSize-1] = 1;
fMessIds[fSize-1] = fMessId;
}
Bool_t TMessageHandler::Notify()
{
if (fClass) return kFALSE;
if (!fMessObj) return kFALSE;
Int_t uid = Int_t(fMessObj->IsA()->GetUniqueID());
fMessId += 10000*uid;
fMessId = -fMessId;
return kFALSE;
}
void TMessageHandler::Print(Option_t *) const
{
printf("\n ****** Message Handler: %s has a total of %d messages\n",GetName(),GetTotalMessageCount());
if (fSize <= 0) return;
Int_t id, uid;
const TClass *cl;
TIter next(gROOT->GetListOfClasses());
for (Int_t i=0;i<fSize;i++) {
id = fMessIds[i];
cl = fClass;
if (id < 0) {
id = -id;
uid = id/10000;
id = id%10000;
next.Reset();
while ((cl=(TClass*)next())) {
if (cl->GetUniqueID() == UInt_t(uid)) break;
}
}
if (!cl) cl = gROOT->IsA();
if (id == 1001) {
printf(" Class: %-20s WARNINGs has %d counts\n",cl->GetName(),fCnts[i]);
continue;
}
if (id == 1002) {
printf(" Class: %-20s ERRORs has %d counts\n",cl->GetName(),fCnts[i]);
continue;
}
printf(" Class: %-20s MessID = %5d has %d counts\n",cl->GetName(),id,fCnts[i]);
}
}
void TMessageHandler::Remove()
{
R__LOCKGUARD2(gROOTMutex);
gROOT->GetListOfMessageHandlers()->Remove(this);
}
Last update: Thu Jan 17 09:00:09 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.