112 TTHREAD_TLS(
bool) readingDirs (
false);
122 const
char *className, const
char *pluginName,
123 const
char *ctor, const
char *origin):
136 TString aclicMode, arguments, io;
143 if (validMacro &&
gROOT->LoadMacro(fPlugin, 0,
kTRUE) == 0)
146 if (fCtor.BeginsWith(
"::")) {
197 using exit_scope = std::shared_ptr<void*>;
198 exit_scope guard(
nullptr,
199 [
this,&setCanCall](
void *) { this->
fCanCall = setCanCall; } );
204 Error(
"SetupCallEnv",
"class %s not found in plugin %s",
fClass.
Data(),
217 fMethod = cl->GetMethodWithPrototype(method, proto);
222 Error(
"SetupCallEnv",
"global function %s not found", method.
Data());
224 Error(
"SetupCallEnv",
"method %s not found in class %s", method.
Data(),
230 Error(
"SetupCallEnv",
"method %s is not public", method.
Data());
277 Error(
"ExecPlugin",
"no ctor specified for this handler %s",
fClass.
Data());
295 Error(
"ExecPlugin",
"nargs (%d) not consistent with expected number of arguments ([%d-%d])",
310 const char *exist =
"";
316 if (strchr(opt,
'a')) {
322 if (path)
Printf(
" [Lib: %s]", path);
358 while ((er = (
TEnvRec*) next())) {
360 if ((s = strstr(er->GetName(),
"Plugin."))) {
364 const char *val = env->
GetValue(s, (
const char*)0);
370 TString regexp = strtok(!cnt ? v : 0,
"; ");
371 if (regexp.
IsNull())
break;
372 TString clss = strtok(0,
"; ");
374 TString plugin = strtok(0,
"; ");
375 if (plugin.
IsNull())
break;
376 TString ctor = strtok(0,
";\"");
378 ctor = strtok(0,
";\"");
379 AddHandler(s, regexp, clss, plugin, ctor,
"TEnv");
396 Info(
"LoadHandlerMacros",
"%s", path);
402 if (f[0] ==
'P' && f.
EndsWith(
".C")) {
415 Info(
"LoadHandlerMacros",
" plugin macro: %s", s->
String().
Data());
418 Error(
"LoadHandlerMacros",
"pluging macro %s returned %ld",
460 fBasesLoaded->SetOwner();
465 if (fBasesLoaded->FindObject(sbase))
483 for (
Int_t j = 0; j < i; j++) {
493 LoadHandlerMacros(p);
499 Info(
"LoadHandlersFromPluginDirs",
"%s", d.
Data());
504 LoadHandlerMacros(p);
523 const char *className,
const char *pluginName,
524 const char *ctor,
const char *origin)
529 fHandlers =
new TList;
534 RemoveHandler(base, regexp);
540 pluginName, ctor, origin);
554 if (!fHandlers)
return;
556 TIter next(fHandlers);
560 if (h->
fBase == base) {
561 if (!regexp || h->
fRegexp == regexp) {
562 fHandlers->Remove(h);
576 LoadHandlersFromPluginDirs(base);
579 TIter next(fHandlers);
585 Info(
"FindHandler",
"found plugin for %s", h->
GetClass());
592 Info(
"FindHandler",
"did not find plugin for class %s and uri %s", base, uri);
594 Info(
"FindHandler",
"did not find plugin for class %s", base);
606 if (!fHandlers)
return;
608 TIter next(fHandlers);
612 Printf(
"=====================================================================");
613 Printf(
"Base Regexp Class Plugin");
614 Printf(
"=====================================================================");
622 Printf(
"=====================================================================");
623 Printf(
"%d plugin handlers registered", cnt);
624 Printf(
"[*] %d %s not available", cntmiss, cntmiss==1 ?
"plugin" :
"plugins");
625 Printf(
"=====================================================================\n");
636 const_cast<TPluginManager*
>(
this)->LoadHandlersFromPluginDirs();
638 if (!fHandlers)
return 0;
647 Error(
"WritePluginMacros",
"cannot write in directory %s", d.
Data());
654 TObjLink *lnk = fHandlers->FirstLink();
657 if (plugin && strcmp(plugin, h->
fBase) && strcmp(plugin, h->
fClass)) {
661 if (base != h->
fBase) {
672 Error(
"WritePluginMacros",
"cannot create directory %s", sdd.
Data());
679 FILE *
f = fopen(fd,
"w");
681 fprintf(f,
"void P%03d_%s()\n{\n", idx, h->
fClass.
Data());
682 fprintf(f,
" gPluginMgr->AddHandler(\"%s\", \"%s\", \"%s\",\n",
694 fprintf(f,
" gPluginMgr->AddHandler(\"%s\", \"%s\", \"%s\",\n",
720 const_cast<TPluginManager*
>(
this)->LoadHandlersFromPluginDirs();
722 if (!fHandlers)
return 0;
725 if (!envFile || !envFile[0])
728 fd = fopen(envFile,
"w+");
731 Error(
"WritePluginRecords",
"error opening file %s", envFile);
738 TObjLink *lnk = fHandlers->FirstLink();
741 if (plugin && strcmp(plugin, h->
fBase) && strcmp(plugin, h->
fClass)) {
745 if (base != h->
fBase) {
754 fprintf(fd,
"Plugin.%s: %s %s %s \"%s\"\n", base2.
Data(), h->
fRegexp.
Data(),
757 fprintf(fd,
"+Plugin.%s: %s %s %s \"%s\"\n", base2.
Data(), h->
fRegexp.
Data(),
768 fprintf(fd,
"+Plugin.%s: %s %s %s \"%s\"\n", base2.
Data(), h2->
fRegexp.
Data(),
777 if (envFile && envFile[0])
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form: ~~~ {.cpp} [path/]macro.C[+|++[k|f|g|O|c|s|d|v|-]][(args)]...
void LoadHandlerMacros(const char *path)
Load all plugin macros from the specified path/base directory.
Bool_t MaybeRegexp() const
Returns true if string contains one of the regexp characters "^$.[]*+?".
Collectable string class.
R__EXTERN TVirtualMutex * gInterpreterMutex
TString & ReplaceAll(const TString &s1, const TString &s2)
Int_t WritePluginRecords(const char *envFile, const char *plugin=0) const
Write in the specified environment config file the plugin records.
Int_t GetNargs() const
Number of function arguments.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
void RemoveHandler(const char *base, const char *regexp=0)
Remove handler for the specified base class and the specified regexp.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
virtual int MakeDirectory(const char *name)
Make a directory.
void Print(Option_t *opt="") const
Print info about the plugin handler.
Regular expression class.
This class implements a mutex interface.
TPluginHandler * FindHandler(const char *base, const char *uri=0)
Returns the handler if there exists a handler for the specified URI.
void LoadHandlersFromEnv(TEnv *env)
Load plugin handlers specified in config file, like: Plugin.TFile: ^rfio: TRFIOFile RFI...
Int_t LoadPlugin()
Load the plugin library for this handler.
The TEnv class reads config files, by default named .rootrc.
Int_t GetEntriesFast() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
const char * Data() const
static bool & TPH__IsReadingDirs()
void SetupCallEnv()
Setup ctor or static method call environment.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
THashTable implements a hash table to store TObject's.
void LoadHandlersFromPluginDirs(const char *base=0)
Load plugin handlers specified via macros in a list of plugin directories.
void Init(const TFunction *func)
Initialize the method invocation environment based on the TFunction object.
A sorted doubly linked list.
Bool_t CheckForExecPlugin(Int_t nargs)
Check that we can properly run ExecPlugin.
Method or function calling interface.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Int_t GetNargsOpt() const
Number of function optional (default) arguments.
void AddHandler(const char *base, const char *regexp, const char *className, const char *pluginName, const char *ctor=0, const char *origin=0)
Add plugin handler to the list of handlers.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
R__EXTERN TSystem * gSystem
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
TObject * GetObject() const
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
This class implements a plugin library manager.
The ROOT global object gROOT contains a list of all defined classes.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
THashList * GetTable() const
virtual void FreeDirectory(void *dirp)
Free a directory.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
char * StrDup(const char *str)
Duplicate the string str.
#define R__LOCKGUARD2(mutex)
AtomicInt_t fCanCall
ctor method or global function
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Wrapper around a TObject so it can be stored in a TList.
Bool_t fIsMacro
if 1 fCallEnv is ok, -1 fCallEnv is not ok, 0 fCallEnv not setup yet.
static TVirtualMutex * gPluginManagerMutex
void Print(Option_t *opt="") const
Print list of registered plugin handlers.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Bool_t CanHandle(const char *base, const char *uri)
Check if regular expression appears in the URI, if so return kTRUE.
Int_t WritePluginMacros(const char *dir, const char *plugin=0) const
Write in the specified directory the plugin macros.
Int_t CheckPlugin() const
Check if the plugin library for this handler exits.
TPluginManager * gPluginMgr
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
void Add(TObject *obj)
Add object in sorted list.
TObject * At(Int_t idx) const
~TPluginHandler()
Cleanup plugin handler object.
const char * GetClass() const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
TFunction * fMethod
ctor method call environment
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
static char * skip(char **buf, const char *delimiters)