#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);
}
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.