00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "Varargs.h"
00062 #include "TQObject.h"
00063 #include "TQConnection.h"
00064 #include "THashList.h"
00065 #include "TPRegexp.h"
00066 #include "TROOT.h"
00067 #include "TClass.h"
00068 #include "TSystem.h"
00069 #include "TMethod.h"
00070 #include "TBaseClass.h"
00071 #include "TDataType.h"
00072 #include "TInterpreter.h"
00073 #include "TQClass.h"
00074 #include "TError.h"
00075 #include "Riostream.h"
00076 #include "RQ_OBJECT.h"
00077 #include "TVirtualMutex.h"
00078 #include "Varargs.h"
00079 #include "TInterpreter.h"
00080 #include "RConfigure.h"
00081
00082 void *gTQSender;
00083
00084
00085
00086 Bool_t TQObject::fgAllSignalsBlocked = kFALSE;
00087
00088
00089 ClassImpQ(TQObject)
00090 ClassImpQ(TQObjSender)
00091 ClassImpQ(TQClass)
00092
00093
00094 namespace
00095 {
00096
00097
00098 TString CompressName(const char *method_name)
00099 {
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 static TPMERegexp *constRe = 0, *wspaceRe = 0;
00110 static TVirtualMutex *lock = 0;
00111
00112 R__LOCKGUARD2(lock);
00113
00114 if (constRe == 0) {
00115 constRe = new TPMERegexp("(?<=\\(|\\s|,|&|\\*)const(?=\\s|,|\\)|&|\\*)", "go");
00116 wspaceRe = new TPMERegexp("\\s+", "go");
00117 }
00118
00119 TString res(method_name);
00120 if (res.IsNull())
00121 return res;
00122
00123 constRe ->Substitute(res, "");
00124 wspaceRe->Substitute(res, "");
00125
00126 TStringToken methargs(res, "\\(|\\)", kTRUE);
00127
00128 methargs.NextToken();
00129 res = methargs;
00130 res += "(";
00131
00132 methargs.NextToken();
00133 TStringToken arg(methargs, ",");
00134 while (arg.NextToken())
00135 {
00136 Int_t pri = arg.Length() - 1;
00137 Char_t prc = 0;
00138 if (arg[pri] == '*' || arg[pri] == '&') {
00139 prc = arg[pri];
00140 arg.Remove(pri);
00141 }
00142 TDataType *dt = gROOT->GetType(arg.Data());
00143 if (dt) {
00144 res += dt->GetFullTypeName();
00145 } else {
00146 res += arg;
00147 }
00148 if (prc) res += prc;
00149 if (!arg.AtEnd()) res += ",";
00150 }
00151 res += ")";
00152 return res;
00153 }
00154
00155
00156 TMethod *GetMethodWithPrototype(TClass *cl, const char *method,
00157 const char *proto, Int_t &nargs)
00158 {
00159
00160
00161 nargs = 0;
00162
00163 if (!gInterpreter) return 0;
00164 R__LOCKGUARD2(gCINTMutex);
00165
00166 Long_t faddr = 0;
00167 if (!cl->IsLoaded()) {
00168
00169 void *clinfo = cl->GetClassInfo();
00170 nargs = gCint->ClassInfo_GetMethodNArg(clinfo,method, proto);
00171 if (nargs >= 0) return (TMethod *) -1;
00172 nargs = 0;
00173 return 0;
00174 } else {
00175 faddr = (Long_t)gInterpreter->GetInterfaceMethodWithPrototype(cl, method,
00176 proto);
00177 if (!faddr) return 0;
00178 }
00179
00180 TMethod *m;
00181 TIter next_method(cl->GetListOfMethods());
00182
00183
00184 while ((m = (TMethod *) next_method())) {
00185 if (faddr == (Long_t)m->InterfaceMethod()) {
00186 nargs = m->GetNargs();
00187 return m;
00188 }
00189 }
00190
00191 TIter next_base(cl->GetListOfBases());
00192 TBaseClass *base;
00193
00194
00195 while ((base = (TBaseClass *)next_base())) {
00196 TClass *c;
00197 if ((c = base->GetClassPointer())) {
00198 if ((m = GetMethodWithPrototype(c, method, proto, nargs))) return m;
00199 }
00200 }
00201 return 0;
00202 }
00203
00204
00205 static TMethod *GetMethod(TClass *cl, const char *method, const char *params)
00206 {
00207
00208
00209 if (!gInterpreter) return 0;
00210 R__LOCKGUARD2(gCINTMutex);
00211
00212 Long_t faddr = 0;
00213 if (!cl->IsLoaded()) {
00214
00215 CallFunc_t *func = gCint->CallFunc_Factory();
00216 long offset;
00217 void *cinfo = cl->GetClassInfo();
00218 gCint->CallFunc_SetFunc(func, cinfo, method, params, &offset);
00219 Bool_t valid = gCint->CallFunc_IsValid(func);
00220 gCint->CallFunc_Delete(func);
00221 if (valid)
00222 return (TMethod *) -1;
00223 return 0;
00224 } else {
00225 faddr = (Long_t)gCint->GetInterfaceMethod(cl, method, params);
00226 if (!faddr) return 0;
00227 }
00228
00229 TMethod *m;
00230 TIter next_method(cl->GetListOfMethods());
00231
00232
00233 while ((m = (TMethod *) next_method())) {
00234 if (faddr == (Long_t)m->InterfaceMethod()) return m;
00235 }
00236
00237 TIter next_base(cl->GetListOfBases());
00238 TBaseClass *base;
00239
00240
00241 while ((base = (TBaseClass *)next_base())) {
00242 TClass *c;
00243 if ((c = base->GetClassPointer())) {
00244 if ((m = GetMethod(c,method,params))) return m;
00245 }
00246 }
00247 return 0;
00248 }
00249
00250 }
00251
00252
00253
00254
00255 Int_t TQObject::CheckConnectArgs(TQObject *sender,
00256 TClass *sender_class, const char *signal,
00257 TClass *receiver_class, const char *slot)
00258 {
00259
00260
00261
00262
00263 char *signal_method = new char[strlen(signal)+1];
00264 if (signal_method) strcpy(signal_method, signal);
00265
00266 char *signal_proto;
00267 char *tmp;
00268
00269 if ((signal_proto = strchr(signal_method,'('))) {
00270
00271 *signal_proto++ = '\0';
00272
00273 if ((tmp = strrchr(signal_proto,')'))) *tmp = '\0';
00274 }
00275
00276 if (!signal_proto) signal_proto = (char*)"";
00277
00278
00279 if (sender && sender_class == TQObjSender::Class()) {
00280 sender_class = TClass::GetClass(sender->GetSenderClassName());
00281 if (!sender_class) {
00282 ::Error("TQObject::CheckConnectArgs", "for signal/slot consistency\n"
00283 "checking need to specify class name as argument to "
00284 "RQ_OBJECT macro");
00285 delete [] signal_method;
00286 return -1;
00287 }
00288 }
00289
00290 Int_t nargs;
00291 TMethod *signalMethod = GetMethodWithPrototype(sender_class,
00292 signal_method,
00293 signal_proto,
00294 nargs);
00295 if (!signalMethod) {
00296 ::Error("TQObject::CheckConnectArgs", "signal %s::%s(%s) does not exist",
00297 sender_class->GetName(), signal_method, signal_proto);
00298 delete [] signal_method;
00299 return -1;
00300 }
00301 Int_t nsigargs = nargs;
00302
00303 #if defined(CHECK_COMMENT_STRING)
00304 const char *comment = 0;
00305 if (signalMethod != (TMethod *) -1)
00306 comment = signalMethod->GetCommentString();
00307
00308 if (!comment || !strlen(comment) || strstr(comment,"*SIGNAL")){
00309 ::Error("TQObject::CheckConnectArgs",
00310 "signal %s::%s(%s), to declare signal use comment //*SIGNAL*",
00311 sender_class->GetName(), signal_method, signal_proto);
00312 delete [] signal_method;
00313 return -1;
00314 }
00315 #endif
00316
00317
00318 delete [] signal_method;
00319
00320 char *slot_method = new char[strlen(slot)+1];
00321 if (slot_method) strcpy(slot_method, slot);
00322
00323 char *slot_proto;
00324 char *slot_params = 0;
00325
00326 if ((slot_proto = strchr(slot_method,'('))) {
00327
00328
00329 *slot_proto++ = '\0';
00330
00331
00332 if ((tmp = strrchr(slot_proto,')'))) *tmp = '\0';
00333 }
00334
00335 if (!slot_proto) slot_proto = (char*)"";
00336 if ((slot_params = strchr(slot_proto,'='))) *slot_params = ' ';
00337
00338 TFunction *slotMethod = 0;
00339 if (!receiver_class) {
00340
00341 slotMethod = (TFunction*)gROOT->GetListOfGlobalFunctions(kTRUE)->
00342 FindObject(slot_method);
00343 } else {
00344 slotMethod = !slot_params ?
00345 GetMethodWithPrototype(receiver_class,
00346 slot_method,
00347 slot_proto,
00348 nargs) :
00349 GetMethod(receiver_class,
00350 slot_method, slot_params);
00351 }
00352
00353 if (!slotMethod) {
00354 if (!slot_params) {
00355 ::Error("TQObject::CheckConnectArgs", "slot %s(%s) does not exist",
00356 receiver_class ? Form("%s::%s", receiver_class->GetName(),
00357 slot_method) : slot_method, slot_proto);
00358 } else {
00359 ::Error("TQObject::CheckConnectArgs", "slot %s(%s) does not exist",
00360 receiver_class ? Form("%s::%s", receiver_class->GetName(),
00361 slot_method) : slot_method, slot_params);
00362 }
00363 delete [] slot_method;
00364 return -1;
00365 }
00366
00367 #if defined(CHECK_ARGS_NUMBER)
00368 if (slotMethod != (TMethod *) -1 && slotMethod->GetNargsOpt() >= 0 &&
00369 nsigargs < (slotMethod->GetNargs() - slotMethod->GetNargsOpt())) {
00370 ::Error("TQObject::CheckConnectArgs",
00371 "inconsistency in numbers of arguments");
00372 delete [] slot_method;
00373 return -1;
00374 }
00375 #endif
00376
00377
00378 delete [] slot_method;
00379
00380 return nsigargs;
00381 }
00382
00383
00384
00385
00386
00387
00388
00389 class TQConnectionList : public TList {
00390
00391 private:
00392 Int_t fSignalArgs;
00393
00394 public:
00395 TQConnectionList(const char *name, Int_t nsigargs) : TList()
00396 { fName = name; fSignalArgs = nsigargs; }
00397 virtual ~TQConnectionList();
00398
00399 Bool_t Disconnect(void *receiver=0, const char *slot_name=0);
00400 Int_t GetNargs() const { return fSignalArgs; }
00401 void ls(Option_t *option = "") const;
00402 };
00403
00404
00405 TQConnectionList::~TQConnectionList()
00406 {
00407
00408
00409 TIter next(this);
00410 TQConnection *connection;
00411
00412 while ((connection = (TQConnection*)next())) {
00413
00414 connection->Remove(this);
00415 if (connection->IsEmpty()) delete connection;
00416 }
00417 Clear("nodelete");
00418 }
00419
00420
00421 Bool_t TQConnectionList::Disconnect(void *receiver, const char *slot_name)
00422 {
00423
00424
00425
00426 TQConnection *connection = 0;
00427 Bool_t return_value = kFALSE;
00428
00429 TObjLink *lnk = FirstLink();
00430 TObjLink *savlnk;
00431
00432 while (lnk) {
00433 connection = (TQConnection*)lnk->GetObject();
00434 const char *name = connection->GetName();
00435 void *obj = connection->GetReceiver();
00436
00437 if (!slot_name || !strlen(slot_name)
00438 || !strcmp(name,slot_name)) {
00439
00440 if (!receiver || (receiver == obj)) {
00441 return_value = kTRUE;
00442 savlnk = lnk->Next();
00443 Remove(lnk);
00444 lnk = savlnk;
00445 connection->Remove(this);
00446 if (connection->IsEmpty()) SafeDelete(connection);
00447 continue;
00448 }
00449 }
00450 lnk = lnk->Next();
00451 }
00452 return return_value;
00453 }
00454
00455
00456 void TQConnectionList::ls(Option_t *option) const
00457 {
00458
00459
00460 cout << "TQConnectionList:" << "\t" << GetName() << endl;
00461 ((TQConnectionList*)this)->R__FOR_EACH(TQConnection,Print)(option);
00462 }
00463
00464
00465
00466 TQObject::TQObject()
00467 {
00468
00469
00470
00471
00472
00473
00474
00475 fListOfSignals = 0;
00476 fListOfConnections = 0;
00477 fSignalsBlocked = kFALSE;
00478 }
00479
00480
00481 TQObject::~TQObject()
00482 {
00483
00484
00485
00486 if (!gROOT) return;
00487
00488 Destroyed();
00489
00490 if (fListOfSignals) {
00491 fListOfSignals->Delete();
00492 SafeDelete(fListOfSignals);
00493 }
00494
00495
00496 if (fListOfConnections) {
00497 TIter next_connection(fListOfConnections);
00498 TQConnection *connection;
00499
00500 while ((connection = (TQConnection*)next_connection())) {
00501 TIter next_list(connection);
00502 TQConnectionList *list;
00503 while ((list = (TQConnectionList*)next_list())) {
00504 list->Remove(connection);
00505 if (list->IsEmpty()) SafeDelete(list);
00506 }
00507 }
00508 SafeDelete(fListOfConnections);
00509 }
00510 }
00511
00512
00513 TList *TQObject::GetListOfClassSignals() const
00514 {
00515
00516
00517 TQClass *qcl = 0;
00518
00519 qcl = dynamic_cast<TQClass*>(IsA());
00520
00521 return qcl ? qcl->fListOfSignals : 0;
00522 }
00523
00524
00525 void TQObject::CollectClassSignalLists(TList& list, TClass* cls)
00526 {
00527
00528
00529
00530
00531
00532
00533 TQClass *qcl = dynamic_cast<TQClass*>(cls);
00534 if (qcl)
00535 {
00536 if (qcl->fListOfSignals)
00537 list.Add(qcl->fListOfSignals);
00538
00539
00540 TIter next_base_class(cls->GetListOfBases());
00541 TBaseClass *base;
00542 while ((base = (TBaseClass*) next_base_class()))
00543 {
00544 CollectClassSignalLists(list, base->GetClassPointer());
00545 }
00546 }
00547 }
00548
00549
00550 void TQObject::HighPriority(const char *signal_name, const char *slot_name)
00551 {
00552
00553
00554
00555
00556
00557
00558
00559 TQConnectionList *clist = (TQConnectionList*)
00560 fListOfSignals->FindObject(signal_name);
00561
00562 if (!clist) return;
00563 if (!slot_name) {
00564 fListOfSignals->Remove(clist);
00565 fListOfSignals->AddFirst(clist);
00566 return;
00567 } else {
00568 TQConnection *con = (TQConnection*) clist->FindObject(slot_name);
00569 if (!con) return;
00570 clist->Remove(con);
00571 clist->AddFirst(con);
00572 }
00573 }
00574
00575
00576 void TQObject::LowPriority(const char *signal_name, const char *slot_name)
00577 {
00578
00579
00580
00581
00582
00583
00584
00585 TQConnectionList *clist = (TQConnectionList*)
00586 fListOfSignals->FindObject(signal_name);
00587
00588 if (!clist) return;
00589 if (!slot_name) {
00590 fListOfSignals->Remove(clist);
00591 fListOfSignals->AddLast(clist);
00592 return;
00593 } else {
00594 TQConnection *con = (TQConnection*) clist->FindObject(slot_name);
00595 if (!con) return;
00596 clist->Remove(con);
00597 clist->AddLast(con);
00598 }
00599 }
00600
00601
00602 Bool_t TQObject::HasConnection(const char *signal_name) const
00603 {
00604
00605
00606
00607 if (!fListOfSignals)
00608 return kFALSE;
00609
00610 TString signal = CompressName(signal_name);
00611
00612 return (fListOfSignals->FindObject(signal) != 0);
00613 }
00614
00615
00616 Int_t TQObject::NumberOfSignals() const
00617 {
00618
00619
00620
00621 if (fListOfSignals)
00622 return fListOfSignals->GetSize();
00623 return 0;
00624 }
00625
00626
00627 Int_t TQObject::NumberOfConnections() const
00628 {
00629
00630
00631 if (fListOfConnections)
00632 return fListOfConnections->GetSize();
00633 return 0;
00634 }
00635
00636
00637 void TQObject::Emit(const char *signal_name)
00638 {
00639
00640
00641
00642
00643 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00644
00645 TList classSigLists;
00646 CollectClassSignalLists(classSigLists, IsA());
00647
00648 if (classSigLists.IsEmpty() && !fListOfSignals)
00649 return;
00650
00651 TString signal = CompressName(signal_name);
00652
00653 register TQConnection *connection = 0;
00654
00655
00656 TList *sigList;
00657 TIter nextSigList(&classSigLists);
00658 while ((sigList = (TList*) nextSigList()))
00659 {
00660 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00661 while ((connection = (TQConnection*)nextcl())) {
00662 gTQSender = GetSender();
00663 connection->ExecuteMethod();
00664 }
00665 }
00666 if (!fListOfSignals)
00667 return;
00668
00669
00670 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00671 while (fListOfSignals && (connection = (TQConnection*)next())) {
00672 gTQSender = GetSender();
00673 connection->ExecuteMethod();
00674 }
00675 }
00676
00677
00678 void TQObject::EmitVA(const char *signal_name, Int_t va_(nargs), ...)
00679 {
00680
00681
00682
00683
00684 va_list ap;
00685 va_start(ap, va_(nargs));
00686
00687 EmitVA(signal_name, va_(nargs), ap);
00688
00689 va_end(ap);
00690 }
00691
00692
00693 void TQObject::EmitVA(const char *signal_name, Int_t nargs, va_list ap)
00694 {
00695
00696
00697
00698 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00699
00700 TList classSigLists;
00701 CollectClassSignalLists(classSigLists, IsA());
00702
00703 if (classSigLists.IsEmpty() && !fListOfSignals)
00704 return;
00705
00706 TString signal = CompressName(signal_name);
00707
00708 register TQConnection *connection = 0;
00709
00710
00711 TList *sigList;
00712 TIter nextSigList(&classSigLists);
00713 while ((sigList = (TList*) nextSigList()))
00714 {
00715 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00716 while ((connection = (TQConnection*)nextcl())) {
00717 gTQSender = GetSender();
00718 connection->ExecuteMethod(nargs, ap);
00719 }
00720 }
00721 if (!fListOfSignals)
00722 return;
00723
00724
00725 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00726 while (fListOfSignals && (connection = (TQConnection*)next())) {
00727 gTQSender = GetSender();
00728 connection->ExecuteMethod(nargs, ap);
00729 }
00730 }
00731
00732
00733 void TQObject::Emit(const char *signal_name, Long_t param)
00734 {
00735
00736
00737
00738
00739 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00740
00741 TList classSigLists;
00742 CollectClassSignalLists(classSigLists, IsA());
00743
00744 if (classSigLists.IsEmpty() && !fListOfSignals)
00745 return;
00746
00747 TString signal = CompressName(signal_name);
00748
00749 register TQConnection *connection = 0;
00750
00751
00752 TList *sigList;
00753 TIter nextSigList(&classSigLists);
00754 while ((sigList = (TList*) nextSigList()))
00755 {
00756 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00757 while ((connection = (TQConnection*)nextcl())) {
00758 gTQSender = GetSender();
00759 connection->ExecuteMethod(param);
00760 }
00761 }
00762 if (!fListOfSignals)
00763 return;
00764
00765
00766 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00767 while (fListOfSignals && (connection = (TQConnection*)next())) {
00768 gTQSender = GetSender();
00769 connection->ExecuteMethod(param);
00770 }
00771 }
00772
00773
00774 void TQObject::Emit(const char *signal_name, Long64_t param)
00775 {
00776
00777
00778
00779
00780 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00781
00782 TList classSigLists;
00783 CollectClassSignalLists(classSigLists, IsA());
00784
00785 if (classSigLists.IsEmpty() && !fListOfSignals)
00786 return;
00787
00788 TString signal = CompressName(signal_name);
00789
00790 register TQConnection *connection = 0;
00791
00792
00793 TList *sigList;
00794 TIter nextSigList(&classSigLists);
00795 while ((sigList = (TList*) nextSigList()))
00796 {
00797 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00798 while ((connection = (TQConnection*)nextcl())) {
00799 gTQSender = GetSender();
00800 connection->ExecuteMethod(param);
00801 }
00802 }
00803 if (!fListOfSignals)
00804 return;
00805
00806
00807 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00808 while (fListOfSignals && (connection = (TQConnection*)next())) {
00809 gTQSender = GetSender();
00810 connection->ExecuteMethod(param);
00811 }
00812 }
00813
00814
00815 void TQObject::Emit(const char *signal_name, Double_t param)
00816 {
00817
00818
00819
00820
00821 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00822
00823 TList classSigLists;
00824 CollectClassSignalLists(classSigLists, IsA());
00825
00826 if (classSigLists.IsEmpty() && !fListOfSignals)
00827 return;
00828
00829 TString signal = CompressName(signal_name);
00830
00831 register TQConnection *connection = 0;
00832
00833
00834 TList *sigList;
00835 TIter nextSigList(&classSigLists);
00836 while ((sigList = (TList*) nextSigList()))
00837 {
00838 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00839 while ((connection = (TQConnection*)nextcl())) {
00840 gTQSender = GetSender();
00841 connection->ExecuteMethod(param);
00842 }
00843 }
00844 if (!fListOfSignals)
00845 return;
00846
00847
00848 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00849 while (fListOfSignals && (connection = (TQConnection*)next())) {
00850 gTQSender = GetSender();
00851 connection->ExecuteMethod(param);
00852 }
00853 }
00854
00855
00856 void TQObject::Emit(const char *signal_name, const char *params)
00857 {
00858
00859
00860
00861
00862 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00863
00864 TList classSigLists;
00865 CollectClassSignalLists(classSigLists, IsA());
00866
00867 if (classSigLists.IsEmpty() && !fListOfSignals)
00868 return;
00869
00870 TString signal = CompressName(signal_name);
00871
00872 register TQConnection *connection = 0;
00873
00874
00875 TList *sigList;
00876 TIter nextSigList(&classSigLists);
00877 while ((sigList = (TList*) nextSigList()))
00878 {
00879 TIter nextcl((TQConnectionList*) sigList->FindObject(signal));
00880 while ((connection = (TQConnection*)nextcl())) {
00881 gTQSender = GetSender();
00882 connection->ExecuteMethod(params);
00883 }
00884 }
00885 if (!fListOfSignals)
00886 return;
00887
00888
00889 TIter next((TQConnectionList*) fListOfSignals->FindObject(signal));
00890 while (fListOfSignals && (connection = (TQConnection*)next())) {
00891 gTQSender = GetSender();
00892 connection->ExecuteMethod(params);
00893 }
00894 }
00895
00896
00897 void TQObject::Emit(const char *signal_name, Long_t *paramArr)
00898 {
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915 if (fSignalsBlocked || fgAllSignalsBlocked) return;
00916
00917 TList classSigLists;
00918 CollectClassSignalLists(classSigLists, IsA());
00919
00920 if (classSigLists.IsEmpty() && !fListOfSignals)
00921 return;
00922
00923 TString signal = CompressName(signal_name);
00924
00925 register TQConnectionList *clist = 0;
00926 register TQConnection *connection = 0;
00927
00928
00929 TList *sigList;
00930 TIter nextSigList(&classSigLists);
00931 while ((sigList = (TList*) nextSigList()))
00932 {
00933 clist = (TQConnectionList*) sigList->FindObject(signal);
00934 TIter nextcl(clist);
00935 while ((connection = (TQConnection*)nextcl())) {
00936 gTQSender = GetSender();
00937 connection->ExecuteMethod(paramArr, clist->GetNargs());
00938 }
00939 }
00940 if (!fListOfSignals)
00941 return;
00942
00943
00944 clist = (TQConnectionList*) fListOfSignals->FindObject(signal);
00945 TIter next(clist);
00946 while (fListOfSignals && (connection = (TQConnection*)next())) {
00947 gTQSender = GetSender();
00948 connection->ExecuteMethod(paramArr, clist->GetNargs());
00949 }
00950 }
00951
00952
00953 Bool_t TQObject::ConnectToClass(TQObject *sender,
00954 const char *signal,
00955 TClass *cl,
00956 void *receiver,
00957 const char *slot)
00958 {
00959
00960
00961
00962
00963 if (!sender->IsA()->InheritsFrom(TQObject::Class()))
00964 return kFALSE;
00965
00966
00967 TString signal_name = CompressName(signal);
00968 TString slot_name = CompressName(slot);
00969
00970
00971 Int_t nsigargs;
00972 if ((nsigargs = CheckConnectArgs(sender, sender->IsA(), signal_name, cl, slot_name)) == -1)
00973 return kFALSE;
00974
00975 if (!sender->fListOfSignals)
00976 sender->fListOfSignals = new THashList();
00977
00978 TQConnectionList *clist = (TQConnectionList*)
00979 sender->fListOfSignals->FindObject(signal_name);
00980
00981 if (!clist) {
00982 clist = new TQConnectionList(signal_name, nsigargs);
00983 sender->fListOfSignals->Add(clist);
00984 }
00985
00986 TIter next(clist);
00987 TQConnection *connection = 0;
00988
00989 while ((connection = (TQConnection*)next())) {
00990 if (!strcmp(slot_name,connection->GetName()) &&
00991 (receiver == connection->GetReceiver())) break;
00992 }
00993
00994 if (!connection)
00995 connection = new TQConnection(cl, receiver, slot_name);
00996
00997
00998 if (!clist->FindObject(connection)) {
00999 clist->Add(connection);
01000 if (!connection->FindObject(clist)) connection->Add(clist);
01001 sender->Connected(signal_name);
01002 }
01003
01004 return kTRUE;
01005 }
01006
01007
01008 Bool_t TQObject::ConnectToClass(const char *class_name,
01009 const char *signal,
01010 TClass *cl,
01011 void *receiver,
01012 const char *slot)
01013 {
01014
01015
01016
01017
01018 TClass *sender = TClass::GetClass(class_name);
01019
01020
01021 if (!sender || !sender->IsA()->InheritsFrom(TQObject::Class()))
01022 return kFALSE;
01023
01024 TList *slist = ((TQClass*)sender)->fListOfSignals;
01025 TString signal_name = CompressName(signal);
01026 TString slot_name = CompressName(slot);
01027
01028
01029 Int_t nsigargs;
01030 if ((nsigargs = CheckConnectArgs(0, sender, signal_name, cl, slot_name)) == -1)
01031 return kFALSE;
01032
01033 if (!slist)
01034 ((TQClass*)sender)->fListOfSignals = slist = new THashList();
01035
01036 TQConnectionList *clist = (TQConnectionList*) slist->FindObject(signal_name);
01037
01038 if (!clist) {
01039 clist = new TQConnectionList(signal_name, nsigargs);
01040 slist->Add(clist);
01041 }
01042
01043 TQConnection *connection = 0;
01044 TIter next(clist);
01045
01046 while ((connection = (TQConnection*)next())) {
01047 if (!strcmp(slot_name,connection->GetName()) &&
01048 (receiver == connection->GetReceiver())) break;
01049 }
01050
01051 if (!connection)
01052 connection = new TQConnection(cl, receiver, slot_name);
01053
01054
01055 if (!clist->FindObject(connection)) {
01056 clist->Add(connection);
01057 if (!connection->FindObject(clist)) connection->Add(clist);
01058 ((TQClass*)sender)->Connected(signal_name);
01059 }
01060
01061 return kTRUE;
01062 }
01063
01064
01065 Bool_t TQObject::Connect(TQObject *sender,
01066 const char *signal,
01067 const char *cl,
01068 void *receiver,
01069 const char *slot)
01070 {
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100 if (cl) {
01101 TClass *rcv_cl = TClass::GetClass(cl);
01102 if (rcv_cl) return ConnectToClass(sender, signal, rcv_cl, receiver, slot);
01103 }
01104
01105
01106
01107
01108
01109 if (!sender->IsA()->InheritsFrom(TQObject::Class()))
01110 return kFALSE;
01111
01112
01113 TString signal_name = CompressName(signal);
01114 TString slot_name = CompressName(slot);
01115
01116
01117 Int_t nsigargs;
01118 if ((nsigargs = CheckConnectArgs(sender, sender->IsA(), signal_name, 0, slot_name)) == -1)
01119 return kFALSE;
01120
01121 if (!sender->fListOfSignals) sender->fListOfSignals = new THashList();
01122
01123 TQConnectionList *clist = (TQConnectionList*)
01124 sender->fListOfSignals->FindObject(signal_name);
01125
01126 if (!clist) {
01127 clist = new TQConnectionList(signal_name, nsigargs);
01128 sender->fListOfSignals->Add(clist);
01129 }
01130
01131 TQConnection *connection = 0;
01132 TIter next(clist);
01133
01134 while ((connection = (TQConnection*)next())) {
01135 if (!strcmp(slot_name,connection->GetName()) &&
01136 (receiver == connection->GetReceiver())) break;
01137 }
01138
01139 if (!connection)
01140 connection = new TQConnection(cl, receiver, slot_name);
01141
01142
01143 if (!clist->FindObject(connection)) {
01144 clist->Add(connection);
01145 if (!connection->FindObject(clist)) connection->Add(clist);
01146 sender->Connected(signal_name);
01147 }
01148
01149 return kTRUE;
01150 }
01151
01152
01153 Bool_t TQObject::Connect(const char *class_name,
01154 const char *signal,
01155 const char *cl,
01156 void *receiver,
01157 const char *slot)
01158 {
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189 if (cl) {
01190 TClass *rcv_cl = TClass::GetClass(cl);
01191 if (rcv_cl) return ConnectToClass(class_name, signal, rcv_cl, receiver,
01192 slot);
01193 }
01194
01195
01196
01197
01198 TClass *sender = TClass::GetClass(class_name);
01199
01200
01201 if (!sender || !sender->IsA()->InheritsFrom(TQObject::Class()))
01202 return kFALSE;
01203
01204 TList *slist = ((TQClass*)sender)->fListOfSignals;
01205
01206 TString signal_name = CompressName(signal);
01207 TString slot_name = CompressName(slot);
01208
01209
01210 Int_t nsigargs;
01211 if ((nsigargs = CheckConnectArgs(0, sender, signal_name, 0, slot_name)) == -1)
01212 return kFALSE;
01213
01214 if (!slist) {
01215 slist = ((TQClass*)sender)->fListOfSignals = new THashList();
01216 }
01217
01218 TQConnectionList *clist = (TQConnectionList*)
01219 slist->FindObject(signal_name);
01220
01221 if (!clist) {
01222 clist = new TQConnectionList(signal_name, nsigargs);
01223 slist->Add(clist);
01224 }
01225
01226 TQConnection *connection = 0;
01227 TIter next(clist);
01228
01229 while ((connection = (TQConnection*)next())) {
01230 if (!strcmp(slot_name,connection->GetName()) &&
01231 (receiver == connection->GetReceiver())) break;
01232 }
01233
01234 if (!connection)
01235 connection = new TQConnection(cl, receiver, slot_name);
01236
01237
01238 if (!clist->FindObject(connection)) {
01239 clist->Add(connection);
01240 if (!connection->FindObject(clist)) connection->Add(clist);
01241 ((TQClass*)sender)->Connected(signal_name);
01242 }
01243
01244 return kTRUE;
01245 }
01246
01247
01248 Bool_t TQObject::Connect(const char *signal,
01249 const char *receiver_class,
01250 void *receiver,
01251 const char *slot)
01252 {
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263 TString signal_name = CompressName(signal);
01264 TString slot_name = CompressName(slot);
01265
01266
01267 TClass *cl = 0;
01268 if (receiver_class)
01269 cl = TClass::GetClass(receiver_class);
01270 Int_t nsigargs;
01271 if ((nsigargs = CheckConnectArgs(this, IsA(), signal_name, cl, slot_name)) == -1)
01272 return kFALSE;
01273
01274 if (!fListOfSignals) fListOfSignals = new THashList();
01275
01276 TQConnectionList *clist = (TQConnectionList*)
01277 fListOfSignals->FindObject(signal_name);
01278
01279 if (!clist) {
01280 clist = new TQConnectionList(signal_name, nsigargs);
01281 fListOfSignals->Add(clist);
01282 }
01283
01284 TIter next(clist);
01285 TQConnection *connection = 0;
01286
01287 while ((connection = (TQConnection*)next())) {
01288 if (!strcmp(slot_name,connection->GetName()) &&
01289 (receiver == connection->GetReceiver())) break;
01290 }
01291
01292 if (!connection)
01293 connection = new TQConnection(receiver_class, receiver, slot_name);
01294
01295
01296 if (!clist->FindObject(connection)) {
01297 clist->Add(connection);
01298 if (!connection->FindObject(clist)) connection->Add(clist);
01299 Connected(signal_name);
01300 }
01301
01302 return kTRUE;
01303 }
01304
01305
01306 Bool_t TQObject::Disconnect(TQObject *sender,
01307 const char *signal,
01308 void *receiver,
01309 const char *slot)
01310 {
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347 Bool_t return_value = kFALSE;
01348 Bool_t next_return = kFALSE;
01349
01350 if (!sender->GetListOfSignals()) return kFALSE;
01351
01352 TString signal_name = CompressName(signal);
01353 TString slot_name = CompressName(slot);
01354
01355 TQConnectionList *slist = 0;
01356 TIter next_signal(sender->GetListOfSignals());
01357
01358 while ((slist = (TQConnectionList*)next_signal())) {
01359 if (!signal || signal_name.IsNull()) {
01360 next_return = slist->Disconnect(receiver,slot_name);
01361 return_value = return_value || next_return;
01362
01363 if (slist->IsEmpty()) {
01364 sender->GetListOfSignals()->Remove(slist);
01365 SafeDelete(slist);
01366 }
01367 } else if (signal && !strcmp(signal_name,slist->GetName())) {
01368 next_return = slist->Disconnect(receiver,slot_name);
01369 return_value = return_value || next_return;
01370
01371 if (slist->IsEmpty()) {
01372 sender->GetListOfSignals()->Remove(slist);
01373 SafeDelete(slist);
01374 break;
01375 }
01376 }
01377 }
01378
01379 if (sender->GetListOfSignals() && sender->GetListOfSignals()->IsEmpty()) {
01380 SafeDelete(sender->fListOfSignals);
01381 }
01382
01383 return return_value;
01384 }
01385
01386
01387 Bool_t TQObject::Disconnect(const char *class_name,
01388 const char *signal,
01389 void *receiver,
01390 const char *slot)
01391 {
01392
01393
01394
01395 TClass *sender = TClass::GetClass(class_name);
01396
01397
01398 if (!sender->IsA()->InheritsFrom(TQObject::Class()))
01399 return kFALSE;
01400
01401 TQClass *qcl = (TQClass*)sender;
01402 return Disconnect(qcl, signal, receiver, slot);
01403 }
01404
01405
01406 Bool_t TQObject::Disconnect(const char *signal,
01407 void *receiver,
01408 const char *slot)
01409 {
01410
01411
01412
01413 return Disconnect(this, signal, receiver, slot);
01414 }
01415
01416
01417 void TQObject::Streamer(TBuffer &R__b)
01418 {
01419
01420
01421 if (R__b.IsReading()) {
01422
01423 } else {
01424
01425 }
01426 }
01427
01428
01429 Bool_t TQObject::AreAllSignalsBlocked()
01430 {
01431
01432
01433 return fgAllSignalsBlocked;
01434 }
01435
01436
01437 Bool_t TQObject::BlockAllSignals(Bool_t b)
01438 {
01439
01440
01441 Bool_t ret = fgAllSignalsBlocked;
01442 fgAllSignalsBlocked = b;
01443 return ret;
01444 }
01445
01446
01447 void TQObject::LoadRQ_OBJECT()
01448 {
01449
01450
01451
01452 gCint->LoadText(RQ_OBJECT_STRING1);
01453 gCint->LoadText(RQ_OBJECT_STRING2);
01454 gCint->LoadText(RQ_OBJECT_STRING);
01455
01456 }
01457
01458
01459
01460
01461
01462
01463
01464 Bool_t ConnectCINT(TQObject *sender, const char *signal, const char *slot)
01465 {
01466 TString str = "ProcessLine(=";
01467 str += '"';
01468 str += slot;
01469 str += '"';
01470 str += ")";
01471 return TQObject::Connect(sender, signal, "TInterpreter",
01472 gInterpreter, str.Data());
01473 }