ROOT logo
// @(#)root/base:$Id: TQConnection.cxx 26440 2008-11-25 03:06:35Z pcanal $
// Author: Valeriy Onuchin & Fons Rademakers   15/10/2000

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TQConnection class is an internal class, used in the object          //
// communication mechanism.                                             //
//                                                                      //
// TQConnection:                                                        //
//    -  is a list of signal_lists containing pointers                  //
//       to this connection                                             //
//    -  receiver is the object to which slot-method is applied         //
//                                                                      //
// This implementation is provided by                                   //
// Valeriy Onuchin (onuchin@sirius.ihep.su).                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "Varargs.h"
#include "TQConnection.h"
#include "TROOT.h"
#include "TRefCnt.h"
#include "TClass.h"
#include "TMethod.h"
#include "TMethodArg.h"
#include "TDataType.h"
#include "TInterpreter.h"
#include "Riostream.h"
#include "TVirtualMutex.h"
#include "THashTable.h"

ClassImpQ(TQConnection)

char *gTQSlotParams; // used to pass string parameter


//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TQSlot = slightly modified TMethodCall class                        //
//           used in the object communication mechanism                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
class TQSlot : public TObject, public TRefCnt {

protected:
   CallFunc_t    *fFunc;      // CINT method invocation environment
   ClassInfo_t   *fClass;     // CINT class for fFunc
   TFunction     *fMethod;    // slot method or global function
   Long_t         fOffset;    // offset added to object pointer
   TString        fName;      // full name of method
   Int_t          fExecuting; // true if one of this slot's ExecuteMethod methods is being called
public:
   TQSlot(TClass *cl, const char *method, const char *funcname);
   TQSlot(const char *class_name, const char *funcname);
   virtual ~TQSlot();

   const char *GetName() const { return fName.Data(); }

   void ExecuteMethod(void *object);
   void ExecuteMethod(void *object, Int_t nargs, va_list ap);
   void ExecuteMethod(void *object, Long_t param);
   void ExecuteMethod(void *object, Long64_t param);
   void ExecuteMethod(void *object, Double_t param);
   void ExecuteMethod(void *object, const char *params);
   void ExecuteMethod(void *object, Long_t *paramArr, Int_t nparam = -1);
   void Print(Option_t *opt= "") const;
   void ls(Option_t *opt= "") const { Print(opt); }

   Bool_t IsExecuting() const { return fExecuting > 0; }
};


//______________________________________________________________________________
TQSlot::TQSlot(TClass *cl, const char *method_name,
               const char *funcname) : TObject(), TRefCnt()
{
   // Create the method invocation environment. Necessary input
   // information: the class, full method name with prototype
   // string of the form: method(char*,int,float).
   // To initialize class method with default arguments, method
   // string with default parameters should be of the form:
   // method(=\"ABC\",1234,3.14) (!! parameter string should
   // consists of '=').
   // To execute the method call TQSlot::ExecuteMethod(object,...).

   fFunc      = 0;
   fClass     = 0;
   fOffset    = 0;
   fMethod    = 0;
   fName      = "";
   fExecuting = 0;

   // cl==0, is the case of interpreted function.

   fName = method_name;

   char *method = new char[strlen(method_name)+1];
   if (method) strcpy(method, method_name);

   char *proto;
   char *tmp;
   char *params = 0;

   // separate method and protoype strings

   if ((proto = strchr(method,'('))) {

      // substitute first '(' symbol with '\0'
      *proto++ = '\0';

      // last ')' symbol with '\0'
      if ((tmp = strrchr(proto,')'))) *tmp = '\0';
      if ((params = strchr(proto,'='))) *params = ' ';
   }

   R__LOCKGUARD2(gCINTMutex);
   fFunc = gCint->CallFunc_Factory();

   // initiate class method (function) with proto
   // or with default params

   if (cl) {
      if (params) {
         gCint->CallFunc_SetFunc(fFunc,cl->GetClassInfo(), method, params, &fOffset);
         fMethod = cl->GetMethod(method, params);
      } else {
         gCint->CallFunc_SetFuncProto(fFunc,cl->GetClassInfo(), method, proto, &fOffset);
         fMethod = cl->GetMethodWithPrototype(method, proto);
      }
   } else {
      fClass = gCint->ClassInfo_Factory();
      if (params) {
         gCint->CallFunc_SetFunc(fFunc,fClass, (char*)funcname, params, &fOffset);
         fMethod = gROOT->GetGlobalFunction(funcname, params, kTRUE);
      } else {
         gCint->CallFunc_SetFuncProto(fFunc,fClass, (char*)funcname, proto, &fOffset);
         fMethod = gROOT->GetGlobalFunctionWithPrototype(funcname, proto, kTRUE);
      }
   }

   // cleaning
   delete [] method;
}

//______________________________________________________________________________
TQSlot::TQSlot(const char *class_name, const char *funcname) :
   TObject(), TRefCnt()
{
   // Create the method invocation environment. Necessary input
   // information: the name of class (could be interpreted class),
   // full method name with prototype or parameter string
   // of the form: method(char*,int,float).
   // To initialize class method with default arguments, method
   // string with default parameters  should be of the form:
   // method(=\"ABC\",1234,3.14) (!! parameter string should
   // consists of '=').
   // To execute the method call TQSlot::ExecuteMethod(object,...).

   fFunc      = 0;
   fClass     = 0;
   fOffset    = 0;
   fMethod    = 0;
   fName      = funcname;
   fExecuting = 0;

   char *method = new char[strlen(funcname)+1];
   if (method) strcpy(method, funcname);

   char *proto;
   char *tmp;
   char *params = 0;

   // separate method and protoype strings

   if ((proto =  strchr(method,'('))) {
      *proto++ = '\0';
      if ((tmp = strrchr(proto,')'))) *tmp  = '\0';
      if ((params = strchr(proto,'='))) *params = ' ';
   }

   R__LOCKGUARD2(gCINTMutex);
   fFunc = gCint->CallFunc_Factory();

   fClass = gCint->ClassInfo_Factory();
   TClass *cl = 0;

   if (!class_name)
      ;                       // function
   else {
      gCint->ClassInfo_Init(fClass,class_name);   // class
      cl = TClass::GetClass(class_name);
   }

   if (params) {
      gCint->CallFunc_SetFunc(fFunc,fClass, method, params, &fOffset);
      if (cl)
         fMethod = cl->GetMethod(method, params);
      else
         fMethod = gROOT->GetGlobalFunction(method, params, kTRUE);
   } else {
      gCint->CallFunc_SetFuncProto(fFunc,fClass, method, proto , &fOffset);
      if (cl)
         fMethod = cl->GetMethodWithPrototype(method, proto);
      else
         fMethod = gROOT->GetGlobalFunctionWithPrototype(method, proto, kTRUE);
   }

   delete [] method;
}

//______________________________________________________________________________
TQSlot::~TQSlot()
{
   // TQSlot dtor.

   // don't delete executing environment of a slot that is being executed
   if (!fExecuting) {
      gCint->CallFunc_Delete(fFunc);
      gCint->ClassInfo_Delete(fClass);
   }
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object)
{
   // ExecuteMethod the method (with preset arguments) for
   // the specified object.

   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   R__LOCKGUARD2(gCINTMutex);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, Int_t nargs, va_list ap)
{
   // ExecuteMethod the method for the specified object and
   // with variable argument list.

   if (!fMethod) {
      Error("ExecuteMethod", "method %s not found,"
            "\n(note: interpreted methods are not supported with varargs)",
            fName.Data());
      return;
   }

   if (nargs < fMethod->GetNargs() - fMethod->GetNargsOpt() ||
       nargs > fMethod->GetNargs()) {
      Error("ExecuteMethod", "nargs (%d) not consistent with expected number of arguments ([%d-%d])",
            nargs, fMethod->GetNargs() - fMethod->GetNargsOpt(),
            fMethod->GetNargs());
      return;
   }

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);

   gCint->CallFunc_ResetArg(fFunc);

   if (nargs > 0) {
      TIter next(fMethod->GetListOfMethodArgs());
      TMethodArg *arg;

      for (int i = 0; i < nargs; i++) {
         arg = (TMethodArg*) next();
         TString type = arg->GetFullTypeName();
         TDataType *dt = gROOT->GetType(type);
         if (dt)
            type = dt->GetFullTypeName();
         if (arg->Property() & (kIsPointer | kIsArray | kIsReference))
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, void*));
            //fCallEnv->SetParam((Long_t) va_arg(ap, void*));
         else if (type == "bool")
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, int));  // bool is promoted to int
            //fCallEnv->SetParam((Long_t) va_arg(ap, int));  // bool is promoted to int
         else if (type == "char" || type == "unsigned char")
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, int));  // char is promoted to int
            //fCallEnv->SetParam((Long_t) va_arg(ap, int));  // char is promoted to int
         else if (type == "short" || type == "unsigned short")
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, int));  // short is promoted to int
            //fCallEnv->SetParam((Long_t) va_arg(ap, int));  // short is promoted to int
         else if (type == "int" || type == "unsigned int")
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, int));
            //fCallEnv->SetParam((Long_t) va_arg(ap, int));
         else if (type == "long" || type == "unsigned long")
            gCint->CallFunc_SetArg(fFunc,(Long_t) va_arg(ap, long));
            //fCallEnv->SetParam((Long_t) va_arg(ap, long));
         else if (type == "long long")
            gCint->CallFunc_SetArg(fFunc,(Long64_t) va_arg(ap, Long64_t));
            //fCallEnv->SetParam((Long64_t) va_arg(ap, Long64_t));
         else if (type == "unsigned long long")
            gCint->CallFunc_SetArg(fFunc,(ULong64_t) va_arg(ap, ULong64_t));
            //fCallEnv->SetParam((ULong64_t) va_arg(ap, ULong64_t));
         else if (type == "float")
            gCint->CallFunc_SetArg(fFunc,(Double_t) va_arg(ap, double));  // float is promoted to double
            //fCallEnv->SetParam((Double_t) va_arg(ap, double));  // float is promoted to double
         else if (type == "double")
            gCint->CallFunc_SetArg(fFunc,(Double_t) va_arg(ap, double));
            //fCallEnv->SetParam((Double_t) va_arg(ap, double));
      }
   }

   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, Long_t param)
{
   // ExecuteMethod the method for the specified object and
   // with single argument value.

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_ResetArg(fFunc);
   gCint->CallFunc_SetArg(fFunc,param);
   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, Long64_t param)
{
   // ExecuteMethod the method for the specified object and
   // with single argument value.

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_ResetArg(fFunc);
   gCint->CallFunc_SetArg(fFunc,param);
   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, Double_t param)
{
   // ExecuteMethod the method for the specified object and
   // with single argument value.

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_ResetArg(fFunc);
   gCint->CallFunc_SetArg(fFunc,param);
   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, const char *param)
{
   // ExecuteMethod the method for the specified object and text param.

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);
   gTQSlotParams = (char*)param;
   gCint->CallFunc_SetArgs(fFunc,"gTQSlotParams");
   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
inline void TQSlot::ExecuteMethod(void *object, Long_t *paramArr, Int_t nparam)
{
   // ExecuteMethod the method for the specified object and with
   // several argument values.
   // ParamArr is an array containing the function argument values.
   // If nparam = -1 then paramArr must contain values for all function
   // arguments, otherwise Nargs-NargsOpt <= nparam <= Nargs, where
   // Nargs is the number of all arguments and NargsOpt is the number
   // of default arguments.

   void *address = 0;
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgArray(fFunc,paramArr, nparam);
   if (object) address = (void*)((Long_t)object + fOffset);
   fExecuting++;
   gCint->CallFunc_Exec(fFunc,address);
   fExecuting--;
   if (!TestBit(kNotDeleted) && !fExecuting)
      gCint->CallFunc_Delete(fFunc);
}

//______________________________________________________________________________
void TQSlot::Print(Option_t *) const
{
   // Print info about slot.

   cout <<IsA()->GetName() << "\t" << GetName() << "\t"
   << "Number of Connections = " << References() << endl;
}

////////////////////////////////////////////////////////////////////////////////

class TQSlotPool {
private:
   THashTable *fTable;
public:
   TQSlotPool() { fTable = new THashTable(50); }
   virtual ~TQSlotPool() { fTable->Clear("nodelete"); }

   TQSlot  *New(const char *class_name, const char *funcname);
   TQSlot  *New(TClass *cl, const char *method, const char *func);
   void     Free(TQSlot *slot);
};

//______________________________________________________________________________
TQSlot *TQSlotPool::New(const char *class_name, const char *funcname)
{
   // Create new slot or return already existing one.

   TString name = class_name;
   name += "::";
   name += funcname;

   TQSlot *slot = (TQSlot*)fTable->FindObject(name.Data());

   if (!slot) {
      slot = new TQSlot(class_name, funcname);
      fTable->Add(slot);
   }
   slot->AddReference();
   return slot;
}

//______________________________________________________________________________
TQSlot *TQSlotPool::New(TClass *cl, const char *method, const char *func)
{
   // Create new slot or return already existing one.

   TString name;

   if (cl) {
      name = cl->GetName();
      name += "::";
      name += method;
   } else {
      name = "::";
      name += func;
   }

   TQSlot *slot = (TQSlot*)fTable->FindObject(name.Data());

   if (!slot) {
      slot = new TQSlot(cl, method, func);
      fTable->Add(slot);
   }
   slot->AddReference();
   return slot;
}

//______________________________________________________________________________
void TQSlotPool::Free(TQSlot *slot)
{
   // Delete slot if there is no reference to it.

   slot->RemoveReference();  // decrease references to slot

   if (slot->References() <= 0) {
      fTable->Remove(slot);
      if (!slot->IsExecuting()) SafeDelete(slot);
   }
}

static TQSlotPool gSlotPool;  // global pool of slots

////////////////////////////////////////////////////////////////////////////////

//______________________________________________________________________________
TQConnection::TQConnection() : TList(), TQObject()
{
   // Default constructor.

   fReceiver = 0;
   fSlot     = 0;
}

//______________________________________________________________________________
TQConnection::TQConnection(TClass *cl, void *receiver, const char *method_name)
   : TList(), TQObject()
{
   // TQConnection ctor.
   //    cl != 0  - connection to object == receiver of class == cl
   //               and method == method_name
   //    cl == 0  - connection to function with name == method_name

   const char *funcname = 0;
   fReceiver = receiver;      // fReceiver is pointer to receiver

   if (!cl) {
      funcname = gCint->Getp2f2funcname(fReceiver);
      if (!funcname)
         Warning("TQConnection", "%s cannot be compiled", method_name);
   }

   if (cl) fClassName = cl->GetName();
   fSlot = gSlotPool.New(cl, method_name, funcname);
}

//______________________________________________________________________________
TQConnection::TQConnection(const char *class_name, void *receiver,
                           const char *funcname) : TList(), TQObject()
{
   // TQConnection ctor.
   //    Creates connection to method of class specified by name,
   //    it could be interpreted class and with method == funcname.

   fClassName = class_name;
   fSlot = gSlotPool.New(class_name, funcname);  // new slot-method
   fReceiver = receiver;      // fReceiver is pointer to receiver
}

//______________________________________________________________________________
TQConnection::TQConnection(const TQConnection &con): TList(), TQObject()
{
   // Copy constructor. Ignore connections to this TQConnections

   fClassName = con.fClassName;
   fSlot = con.fSlot;
   fSlot->AddReference();
   fReceiver = con.fReceiver;
}

//______________________________________________________________________________
TQConnection::~TQConnection()
{
   // TQConnection dtor.
   //    - remove this connection from all signal lists
   //    - we do not delete fSlot if it has other connections,
   //      TQSlot::fCounter > 0 .

   TIter next(this);
   register TList *list;

   while ((list = (TList*)next())) {
      list->Remove(this);
      if (list->IsEmpty()) delete list;   // delete empty list
   }
   Clear("nodelete");

   if (!fSlot) return;
   gSlotPool.Free(fSlot);
}

//______________________________________________________________________________
const char *TQConnection::GetName() const
{
   // Returns name of connection (aka name of slot)

   return fSlot->GetName();
}

//______________________________________________________________________________
void TQConnection::Destroyed()
{
   // Signal Destroyed tells that connection is destroyed.

   MakeZombie();
   Emit("Destroyed()");
}

//______________________________________________________________________________
void TQConnection::ls(Option_t *option) const
{
   // List TQConnection full method name and list all signals
   // connected to this connection.

   cout << "\t" <<  IsA()->GetName() << "\t" << GetName() << endl;
   ((TQConnection*)this)->R__FOR_EACH(TList,ls)(option);
}

//______________________________________________________________________________
void TQConnection::PrintCollectionHeader(Option_t *) const
{
   // Print TQConnection full method name and print all
   // signals connected to this connection.

   TROOT::IndentLevel();
   cout << IsA()->GetName() << "\t" << fReceiver << "\t" << GetName() << endl;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod()
{
   // Apply slot-method to the fReceiver object without arguments.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(Int_t nargs, va_list va)
{
   // Apply slot-method to the fReceiver object with
   // variable argument list.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, nargs, va);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(Long_t param)
{
   // Apply slot-method to the fReceiver object with
   // single argument value.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, param);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(Long64_t param)
{
   // Apply slot-method to the fReceiver object with
   // single argument value.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, param);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(Double_t param)
{
   // Apply slot-method to the fReceiver object with
   // single argument value.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, param);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(Long_t *params, Int_t nparam)
{
   // Apply slot-method to the fReceiver object with variable
   // number of argument values.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, params, nparam);
   if (s->References() <= 0) delete s;
}

//______________________________________________________________________________
void TQConnection::ExecuteMethod(const char *param)
{
   // Apply slot-method to the fReceiver object and
   // with string parameter.

   // This connection might be deleted in result of the method execution
   // (for example in case of a Disconnect).  Hence we do not assume
   // the object is still valid on return.
   TQSlot *s = fSlot;
   fSlot->ExecuteMethod(fReceiver, param);
   if (s->References() <= 0) delete s;
}
 TQConnection.cxx:1
 TQConnection.cxx:2
 TQConnection.cxx:3
 TQConnection.cxx:4
 TQConnection.cxx:5
 TQConnection.cxx:6
 TQConnection.cxx:7
 TQConnection.cxx:8
 TQConnection.cxx:9
 TQConnection.cxx:10
 TQConnection.cxx:11
 TQConnection.cxx:12
 TQConnection.cxx:13
 TQConnection.cxx:14
 TQConnection.cxx:15
 TQConnection.cxx:16
 TQConnection.cxx:17
 TQConnection.cxx:18
 TQConnection.cxx:19
 TQConnection.cxx:20
 TQConnection.cxx:21
 TQConnection.cxx:22
 TQConnection.cxx:23
 TQConnection.cxx:24
 TQConnection.cxx:25
 TQConnection.cxx:26
 TQConnection.cxx:27
 TQConnection.cxx:28
 TQConnection.cxx:29
 TQConnection.cxx:30
 TQConnection.cxx:31
 TQConnection.cxx:32
 TQConnection.cxx:33
 TQConnection.cxx:34
 TQConnection.cxx:35
 TQConnection.cxx:36
 TQConnection.cxx:37
 TQConnection.cxx:38
 TQConnection.cxx:39
 TQConnection.cxx:40
 TQConnection.cxx:41
 TQConnection.cxx:42
 TQConnection.cxx:43
 TQConnection.cxx:44
 TQConnection.cxx:45
 TQConnection.cxx:46
 TQConnection.cxx:47
 TQConnection.cxx:48
 TQConnection.cxx:49
 TQConnection.cxx:50
 TQConnection.cxx:51
 TQConnection.cxx:52
 TQConnection.cxx:53
 TQConnection.cxx:54
 TQConnection.cxx:55
 TQConnection.cxx:56
 TQConnection.cxx:57
 TQConnection.cxx:58
 TQConnection.cxx:59
 TQConnection.cxx:60
 TQConnection.cxx:61
 TQConnection.cxx:62
 TQConnection.cxx:63
 TQConnection.cxx:64
 TQConnection.cxx:65
 TQConnection.cxx:66
 TQConnection.cxx:67
 TQConnection.cxx:68
 TQConnection.cxx:69
 TQConnection.cxx:70
 TQConnection.cxx:71
 TQConnection.cxx:72
 TQConnection.cxx:73
 TQConnection.cxx:74
 TQConnection.cxx:75
 TQConnection.cxx:76
 TQConnection.cxx:77
 TQConnection.cxx:78
 TQConnection.cxx:79
 TQConnection.cxx:80
 TQConnection.cxx:81
 TQConnection.cxx:82
 TQConnection.cxx:83
 TQConnection.cxx:84
 TQConnection.cxx:85
 TQConnection.cxx:86
 TQConnection.cxx:87
 TQConnection.cxx:88
 TQConnection.cxx:89
 TQConnection.cxx:90
 TQConnection.cxx:91
 TQConnection.cxx:92
 TQConnection.cxx:93
 TQConnection.cxx:94
 TQConnection.cxx:95
 TQConnection.cxx:96
 TQConnection.cxx:97
 TQConnection.cxx:98
 TQConnection.cxx:99
 TQConnection.cxx:100
 TQConnection.cxx:101
 TQConnection.cxx:102
 TQConnection.cxx:103
 TQConnection.cxx:104
 TQConnection.cxx:105
 TQConnection.cxx:106
 TQConnection.cxx:107
 TQConnection.cxx:108
 TQConnection.cxx:109
 TQConnection.cxx:110
 TQConnection.cxx:111
 TQConnection.cxx:112
 TQConnection.cxx:113
 TQConnection.cxx:114
 TQConnection.cxx:115
 TQConnection.cxx:116
 TQConnection.cxx:117
 TQConnection.cxx:118
 TQConnection.cxx:119
 TQConnection.cxx:120
 TQConnection.cxx:121
 TQConnection.cxx:122
 TQConnection.cxx:123
 TQConnection.cxx:124
 TQConnection.cxx:125
 TQConnection.cxx:126
 TQConnection.cxx:127
 TQConnection.cxx:128
 TQConnection.cxx:129
 TQConnection.cxx:130
 TQConnection.cxx:131
 TQConnection.cxx:132
 TQConnection.cxx:133
 TQConnection.cxx:134
 TQConnection.cxx:135
 TQConnection.cxx:136
 TQConnection.cxx:137
 TQConnection.cxx:138
 TQConnection.cxx:139
 TQConnection.cxx:140
 TQConnection.cxx:141
 TQConnection.cxx:142
 TQConnection.cxx:143
 TQConnection.cxx:144
 TQConnection.cxx:145
 TQConnection.cxx:146
 TQConnection.cxx:147
 TQConnection.cxx:148
 TQConnection.cxx:149
 TQConnection.cxx:150
 TQConnection.cxx:151
 TQConnection.cxx:152
 TQConnection.cxx:153
 TQConnection.cxx:154
 TQConnection.cxx:155
 TQConnection.cxx:156
 TQConnection.cxx:157
 TQConnection.cxx:158
 TQConnection.cxx:159
 TQConnection.cxx:160
 TQConnection.cxx:161
 TQConnection.cxx:162
 TQConnection.cxx:163
 TQConnection.cxx:164
 TQConnection.cxx:165
 TQConnection.cxx:166
 TQConnection.cxx:167
 TQConnection.cxx:168
 TQConnection.cxx:169
 TQConnection.cxx:170
 TQConnection.cxx:171
 TQConnection.cxx:172
 TQConnection.cxx:173
 TQConnection.cxx:174
 TQConnection.cxx:175
 TQConnection.cxx:176
 TQConnection.cxx:177
 TQConnection.cxx:178
 TQConnection.cxx:179
 TQConnection.cxx:180
 TQConnection.cxx:181
 TQConnection.cxx:182
 TQConnection.cxx:183
 TQConnection.cxx:184
 TQConnection.cxx:185
 TQConnection.cxx:186
 TQConnection.cxx:187
 TQConnection.cxx:188
 TQConnection.cxx:189
 TQConnection.cxx:190
 TQConnection.cxx:191
 TQConnection.cxx:192
 TQConnection.cxx:193
 TQConnection.cxx:194
 TQConnection.cxx:195
 TQConnection.cxx:196
 TQConnection.cxx:197
 TQConnection.cxx:198
 TQConnection.cxx:199
 TQConnection.cxx:200
 TQConnection.cxx:201
 TQConnection.cxx:202
 TQConnection.cxx:203
 TQConnection.cxx:204
 TQConnection.cxx:205
 TQConnection.cxx:206
 TQConnection.cxx:207
 TQConnection.cxx:208
 TQConnection.cxx:209
 TQConnection.cxx:210
 TQConnection.cxx:211
 TQConnection.cxx:212
 TQConnection.cxx:213
 TQConnection.cxx:214
 TQConnection.cxx:215
 TQConnection.cxx:216
 TQConnection.cxx:217
 TQConnection.cxx:218
 TQConnection.cxx:219
 TQConnection.cxx:220
 TQConnection.cxx:221
 TQConnection.cxx:222
 TQConnection.cxx:223
 TQConnection.cxx:224
 TQConnection.cxx:225
 TQConnection.cxx:226
 TQConnection.cxx:227
 TQConnection.cxx:228
 TQConnection.cxx:229
 TQConnection.cxx:230
 TQConnection.cxx:231
 TQConnection.cxx:232
 TQConnection.cxx:233
 TQConnection.cxx:234
 TQConnection.cxx:235
 TQConnection.cxx:236
 TQConnection.cxx:237
 TQConnection.cxx:238
 TQConnection.cxx:239
 TQConnection.cxx:240
 TQConnection.cxx:241
 TQConnection.cxx:242
 TQConnection.cxx:243
 TQConnection.cxx:244
 TQConnection.cxx:245
 TQConnection.cxx:246
 TQConnection.cxx:247
 TQConnection.cxx:248
 TQConnection.cxx:249
 TQConnection.cxx:250
 TQConnection.cxx:251
 TQConnection.cxx:252
 TQConnection.cxx:253
 TQConnection.cxx:254
 TQConnection.cxx:255
 TQConnection.cxx:256
 TQConnection.cxx:257
 TQConnection.cxx:258
 TQConnection.cxx:259
 TQConnection.cxx:260
 TQConnection.cxx:261
 TQConnection.cxx:262
 TQConnection.cxx:263
 TQConnection.cxx:264
 TQConnection.cxx:265
 TQConnection.cxx:266
 TQConnection.cxx:267
 TQConnection.cxx:268
 TQConnection.cxx:269
 TQConnection.cxx:270
 TQConnection.cxx:271
 TQConnection.cxx:272
 TQConnection.cxx:273
 TQConnection.cxx:274
 TQConnection.cxx:275
 TQConnection.cxx:276
 TQConnection.cxx:277
 TQConnection.cxx:278
 TQConnection.cxx:279
 TQConnection.cxx:280
 TQConnection.cxx:281
 TQConnection.cxx:282
 TQConnection.cxx:283
 TQConnection.cxx:284
 TQConnection.cxx:285
 TQConnection.cxx:286
 TQConnection.cxx:287
 TQConnection.cxx:288
 TQConnection.cxx:289
 TQConnection.cxx:290
 TQConnection.cxx:291
 TQConnection.cxx:292
 TQConnection.cxx:293
 TQConnection.cxx:294
 TQConnection.cxx:295
 TQConnection.cxx:296
 TQConnection.cxx:297
 TQConnection.cxx:298
 TQConnection.cxx:299
 TQConnection.cxx:300
 TQConnection.cxx:301
 TQConnection.cxx:302
 TQConnection.cxx:303
 TQConnection.cxx:304
 TQConnection.cxx:305
 TQConnection.cxx:306
 TQConnection.cxx:307
 TQConnection.cxx:308
 TQConnection.cxx:309
 TQConnection.cxx:310
 TQConnection.cxx:311
 TQConnection.cxx:312
 TQConnection.cxx:313
 TQConnection.cxx:314
 TQConnection.cxx:315
 TQConnection.cxx:316
 TQConnection.cxx:317
 TQConnection.cxx:318
 TQConnection.cxx:319
 TQConnection.cxx:320
 TQConnection.cxx:321
 TQConnection.cxx:322
 TQConnection.cxx:323
 TQConnection.cxx:324
 TQConnection.cxx:325
 TQConnection.cxx:326
 TQConnection.cxx:327
 TQConnection.cxx:328
 TQConnection.cxx:329
 TQConnection.cxx:330
 TQConnection.cxx:331
 TQConnection.cxx:332
 TQConnection.cxx:333
 TQConnection.cxx:334
 TQConnection.cxx:335
 TQConnection.cxx:336
 TQConnection.cxx:337
 TQConnection.cxx:338
 TQConnection.cxx:339
 TQConnection.cxx:340
 TQConnection.cxx:341
 TQConnection.cxx:342
 TQConnection.cxx:343
 TQConnection.cxx:344
 TQConnection.cxx:345
 TQConnection.cxx:346
 TQConnection.cxx:347
 TQConnection.cxx:348
 TQConnection.cxx:349
 TQConnection.cxx:350
 TQConnection.cxx:351
 TQConnection.cxx:352
 TQConnection.cxx:353
 TQConnection.cxx:354
 TQConnection.cxx:355
 TQConnection.cxx:356
 TQConnection.cxx:357
 TQConnection.cxx:358
 TQConnection.cxx:359
 TQConnection.cxx:360
 TQConnection.cxx:361
 TQConnection.cxx:362
 TQConnection.cxx:363
 TQConnection.cxx:364
 TQConnection.cxx:365
 TQConnection.cxx:366
 TQConnection.cxx:367
 TQConnection.cxx:368
 TQConnection.cxx:369
 TQConnection.cxx:370
 TQConnection.cxx:371
 TQConnection.cxx:372
 TQConnection.cxx:373
 TQConnection.cxx:374
 TQConnection.cxx:375
 TQConnection.cxx:376
 TQConnection.cxx:377
 TQConnection.cxx:378
 TQConnection.cxx:379
 TQConnection.cxx:380
 TQConnection.cxx:381
 TQConnection.cxx:382
 TQConnection.cxx:383
 TQConnection.cxx:384
 TQConnection.cxx:385
 TQConnection.cxx:386
 TQConnection.cxx:387
 TQConnection.cxx:388
 TQConnection.cxx:389
 TQConnection.cxx:390
 TQConnection.cxx:391
 TQConnection.cxx:392
 TQConnection.cxx:393
 TQConnection.cxx:394
 TQConnection.cxx:395
 TQConnection.cxx:396
 TQConnection.cxx:397
 TQConnection.cxx:398
 TQConnection.cxx:399
 TQConnection.cxx:400
 TQConnection.cxx:401
 TQConnection.cxx:402
 TQConnection.cxx:403
 TQConnection.cxx:404
 TQConnection.cxx:405
 TQConnection.cxx:406
 TQConnection.cxx:407
 TQConnection.cxx:408
 TQConnection.cxx:409
 TQConnection.cxx:410
 TQConnection.cxx:411
 TQConnection.cxx:412
 TQConnection.cxx:413
 TQConnection.cxx:414
 TQConnection.cxx:415
 TQConnection.cxx:416
 TQConnection.cxx:417
 TQConnection.cxx:418
 TQConnection.cxx:419
 TQConnection.cxx:420
 TQConnection.cxx:421
 TQConnection.cxx:422
 TQConnection.cxx:423
 TQConnection.cxx:424
 TQConnection.cxx:425
 TQConnection.cxx:426
 TQConnection.cxx:427
 TQConnection.cxx:428
 TQConnection.cxx:429
 TQConnection.cxx:430
 TQConnection.cxx:431
 TQConnection.cxx:432
 TQConnection.cxx:433
 TQConnection.cxx:434
 TQConnection.cxx:435
 TQConnection.cxx:436
 TQConnection.cxx:437
 TQConnection.cxx:438
 TQConnection.cxx:439
 TQConnection.cxx:440
 TQConnection.cxx:441
 TQConnection.cxx:442
 TQConnection.cxx:443
 TQConnection.cxx:444
 TQConnection.cxx:445
 TQConnection.cxx:446
 TQConnection.cxx:447
 TQConnection.cxx:448
 TQConnection.cxx:449
 TQConnection.cxx:450
 TQConnection.cxx:451
 TQConnection.cxx:452
 TQConnection.cxx:453
 TQConnection.cxx:454
 TQConnection.cxx:455
 TQConnection.cxx:456
 TQConnection.cxx:457
 TQConnection.cxx:458
 TQConnection.cxx:459
 TQConnection.cxx:460
 TQConnection.cxx:461
 TQConnection.cxx:462
 TQConnection.cxx:463
 TQConnection.cxx:464
 TQConnection.cxx:465
 TQConnection.cxx:466
 TQConnection.cxx:467
 TQConnection.cxx:468
 TQConnection.cxx:469
 TQConnection.cxx:470
 TQConnection.cxx:471
 TQConnection.cxx:472
 TQConnection.cxx:473
 TQConnection.cxx:474
 TQConnection.cxx:475
 TQConnection.cxx:476
 TQConnection.cxx:477
 TQConnection.cxx:478
 TQConnection.cxx:479
 TQConnection.cxx:480
 TQConnection.cxx:481
 TQConnection.cxx:482
 TQConnection.cxx:483
 TQConnection.cxx:484
 TQConnection.cxx:485
 TQConnection.cxx:486
 TQConnection.cxx:487
 TQConnection.cxx:488
 TQConnection.cxx:489
 TQConnection.cxx:490
 TQConnection.cxx:491
 TQConnection.cxx:492
 TQConnection.cxx:493
 TQConnection.cxx:494
 TQConnection.cxx:495
 TQConnection.cxx:496
 TQConnection.cxx:497
 TQConnection.cxx:498
 TQConnection.cxx:499
 TQConnection.cxx:500
 TQConnection.cxx:501
 TQConnection.cxx:502
 TQConnection.cxx:503
 TQConnection.cxx:504
 TQConnection.cxx:505
 TQConnection.cxx:506
 TQConnection.cxx:507
 TQConnection.cxx:508
 TQConnection.cxx:509
 TQConnection.cxx:510
 TQConnection.cxx:511
 TQConnection.cxx:512
 TQConnection.cxx:513
 TQConnection.cxx:514
 TQConnection.cxx:515
 TQConnection.cxx:516
 TQConnection.cxx:517
 TQConnection.cxx:518
 TQConnection.cxx:519
 TQConnection.cxx:520
 TQConnection.cxx:521
 TQConnection.cxx:522
 TQConnection.cxx:523
 TQConnection.cxx:524
 TQConnection.cxx:525
 TQConnection.cxx:526
 TQConnection.cxx:527
 TQConnection.cxx:528
 TQConnection.cxx:529
 TQConnection.cxx:530
 TQConnection.cxx:531
 TQConnection.cxx:532
 TQConnection.cxx:533
 TQConnection.cxx:534
 TQConnection.cxx:535
 TQConnection.cxx:536
 TQConnection.cxx:537
 TQConnection.cxx:538
 TQConnection.cxx:539
 TQConnection.cxx:540
 TQConnection.cxx:541
 TQConnection.cxx:542
 TQConnection.cxx:543
 TQConnection.cxx:544
 TQConnection.cxx:545
 TQConnection.cxx:546
 TQConnection.cxx:547
 TQConnection.cxx:548
 TQConnection.cxx:549
 TQConnection.cxx:550
 TQConnection.cxx:551
 TQConnection.cxx:552
 TQConnection.cxx:553
 TQConnection.cxx:554
 TQConnection.cxx:555
 TQConnection.cxx:556
 TQConnection.cxx:557
 TQConnection.cxx:558
 TQConnection.cxx:559
 TQConnection.cxx:560
 TQConnection.cxx:561
 TQConnection.cxx:562
 TQConnection.cxx:563
 TQConnection.cxx:564
 TQConnection.cxx:565
 TQConnection.cxx:566
 TQConnection.cxx:567
 TQConnection.cxx:568
 TQConnection.cxx:569
 TQConnection.cxx:570
 TQConnection.cxx:571
 TQConnection.cxx:572
 TQConnection.cxx:573
 TQConnection.cxx:574
 TQConnection.cxx:575
 TQConnection.cxx:576
 TQConnection.cxx:577
 TQConnection.cxx:578
 TQConnection.cxx:579
 TQConnection.cxx:580
 TQConnection.cxx:581
 TQConnection.cxx:582
 TQConnection.cxx:583
 TQConnection.cxx:584
 TQConnection.cxx:585
 TQConnection.cxx:586
 TQConnection.cxx:587
 TQConnection.cxx:588
 TQConnection.cxx:589
 TQConnection.cxx:590
 TQConnection.cxx:591
 TQConnection.cxx:592
 TQConnection.cxx:593
 TQConnection.cxx:594
 TQConnection.cxx:595
 TQConnection.cxx:596
 TQConnection.cxx:597
 TQConnection.cxx:598
 TQConnection.cxx:599
 TQConnection.cxx:600
 TQConnection.cxx:601
 TQConnection.cxx:602
 TQConnection.cxx:603
 TQConnection.cxx:604
 TQConnection.cxx:605
 TQConnection.cxx:606
 TQConnection.cxx:607
 TQConnection.cxx:608
 TQConnection.cxx:609
 TQConnection.cxx:610
 TQConnection.cxx:611
 TQConnection.cxx:612
 TQConnection.cxx:613
 TQConnection.cxx:614
 TQConnection.cxx:615
 TQConnection.cxx:616
 TQConnection.cxx:617
 TQConnection.cxx:618
 TQConnection.cxx:619
 TQConnection.cxx:620
 TQConnection.cxx:621
 TQConnection.cxx:622
 TQConnection.cxx:623
 TQConnection.cxx:624
 TQConnection.cxx:625
 TQConnection.cxx:626
 TQConnection.cxx:627
 TQConnection.cxx:628
 TQConnection.cxx:629
 TQConnection.cxx:630
 TQConnection.cxx:631
 TQConnection.cxx:632
 TQConnection.cxx:633
 TQConnection.cxx:634
 TQConnection.cxx:635
 TQConnection.cxx:636
 TQConnection.cxx:637
 TQConnection.cxx:638
 TQConnection.cxx:639
 TQConnection.cxx:640
 TQConnection.cxx:641
 TQConnection.cxx:642
 TQConnection.cxx:643
 TQConnection.cxx:644
 TQConnection.cxx:645
 TQConnection.cxx:646
 TQConnection.cxx:647
 TQConnection.cxx:648
 TQConnection.cxx:649
 TQConnection.cxx:650
 TQConnection.cxx:651
 TQConnection.cxx:652
 TQConnection.cxx:653
 TQConnection.cxx:654
 TQConnection.cxx:655
 TQConnection.cxx:656
 TQConnection.cxx:657
 TQConnection.cxx:658
 TQConnection.cxx:659
 TQConnection.cxx:660
 TQConnection.cxx:661
 TQConnection.cxx:662
 TQConnection.cxx:663
 TQConnection.cxx:664
 TQConnection.cxx:665
 TQConnection.cxx:666
 TQConnection.cxx:667
 TQConnection.cxx:668
 TQConnection.cxx:669
 TQConnection.cxx:670
 TQConnection.cxx:671
 TQConnection.cxx:672
 TQConnection.cxx:673
 TQConnection.cxx:674
 TQConnection.cxx:675
 TQConnection.cxx:676
 TQConnection.cxx:677
 TQConnection.cxx:678
 TQConnection.cxx:679
 TQConnection.cxx:680
 TQConnection.cxx:681
 TQConnection.cxx:682
 TQConnection.cxx:683
 TQConnection.cxx:684
 TQConnection.cxx:685
 TQConnection.cxx:686
 TQConnection.cxx:687
 TQConnection.cxx:688
 TQConnection.cxx:689
 TQConnection.cxx:690
 TQConnection.cxx:691
 TQConnection.cxx:692
 TQConnection.cxx:693
 TQConnection.cxx:694
 TQConnection.cxx:695
 TQConnection.cxx:696
 TQConnection.cxx:697
 TQConnection.cxx:698
 TQConnection.cxx:699
 TQConnection.cxx:700
 TQConnection.cxx:701
 TQConnection.cxx:702
 TQConnection.cxx:703
 TQConnection.cxx:704
 TQConnection.cxx:705
 TQConnection.cxx:706
 TQConnection.cxx:707
 TQConnection.cxx:708
 TQConnection.cxx:709
 TQConnection.cxx:710