Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DLTools.H
Go to the documentation of this file.
1 #ifndef _DL_TOOLS_H_
7 #define _DL_TOOLS_H_
8 #include <dlfcn.h>
9 #include <string>
10 #include <sstream>
11 
12 namespace Sys {
13 
14  typedef void* dlHandleType;
15 
16  template<typename ObjectType>
17  class ObjectFactory {
18  protected:
19  ObjectType* (*_create)();
20  void (*_destroy)(ObjectType*);
21  public:
22  ObjectFactory() : _create(NULL), _destroy(NULL)
23  {};
24  virtual ObjectType* Create(){return((*_create)()); };
25  virtual ObjectType* (*CreatePtr())(){return(_create); };
26  virtual void (*DestroyPtr())(ObjectType*){return(_destroy); };
27  virtual void Destroy(ObjectType *objptr){(*_destroy)(objptr); };
28  virtual void SetCreate(ObjectType* (*increate)()){_create = increate;};
29  virtual void SetDestroy(void (*indestroy)(ObjectType*)){_destroy = indestroy; };
30  virtual ~ObjectFactory(){};
31  };
32 
33  template<typename ObjectType>
34  class DynamicObjectLib : public std::pair<std::string,dlHandleType>
35  {
36  protected:
37  std::string _path;
39  public:
40  virtual dlHandleType Handle() const { return(this->second); };
41  virtual std::string Name() const { return(this->first); };
42  virtual std::string File() const { return(_path); };
43  virtual std::string &Name() { return(this->first); };
44  virtual std::string &File() { return(_path); };
45  virtual std::string Error(){ return(std::string(dlerror())); };
46  virtual ObjectFactory<ObjectType> &Factory() { return(_factory); };
47  virtual ObjectFactory<ObjectType> Factory() const { return(_factory); };
48  virtual ObjectType* CreateObject(const std::string &objectname)
49  {
50  ObjectType* retval = static_cast<ObjectType*>(NULL);
51  if(this->second){
52  std::ostringstream Ostr;
53  Ostr << "create_" << objectname;
54  _factory.SetCreate((ObjectType * (*)())dlsym(this->second,Ostr.str().c_str()));
55  if(_factory.CreatePtr() != NULL)
56  retval = _factory.Create();
57  }
58  return(retval);
59  };
60  virtual void DestroyObject(const std::string &objectname,ObjectType *objptr)
61  {
62  if(this->second){
63  std::ostringstream Ostr;
64  Ostr << "destroy_" << objectname;
65  _factory.SetDestroy((void (*)(ObjectType *))dlsym(this->second,Ostr.str().c_str()));
66  if(_factory.DestroyPtr() != NULL)
67  _factory.Destroy(objptr);
68  }
69  };
70  virtual int Load(const std::string &name,const std::string &path)
71  {
72  void *handle = dlopen(path.c_str(),RTLD_LAZY);
73  if(handle){
74  if(this->second)
75  dlclose(this->second);
76  this->first = name;
77  this->second = handle;
78  }
79  else
80  return(1);
81  return(0);
82  };
83  virtual void Unload()
84  {
85  if(this->second)
86  dlclose(this->second);
87  this->second = NULL;
88  this->first.erase();
89  _path.erase();
90  _factory.SetCreate(NULL);
91  _factory.SetDestroy(NULL);
92  };
93  virtual ~DynamicObjectLib(){ if(this->second) dlclose(this->second);};
94  };
95 }
96 #endif
virtual void(*)(ObjectType *) DestroyPtr()
Definition: DLTools.H:26
virtual ObjectFactory< ObjectType > & Factory()
Definition: DLTools.H:46
virtual ObjectType *(*)() CreatePtr()
Definition: DLTools.H:25
virtual void SetCreate(ObjectType *(*increate)())
Definition: DLTools.H:28
virtual ~DynamicObjectLib()
Definition: DLTools.H:93
virtual ~ObjectFactory()
Definition: DLTools.H:30
virtual std::string File() const
Definition: DLTools.H:42
void(* _destroy)(ObjectType *)
Definition: DLTools.H:20
virtual std::string Name() const
Definition: DLTools.H:41
virtual std::string Error()
Definition: DLTools.H:45
ObjectFactory< ObjectType > _factory
Definition: DLTools.H:38
virtual void DestroyObject(const std::string &objectname, ObjectType *objptr)
Definition: DLTools.H:60
virtual std::string & Name()
Definition: DLTools.H:43
void * dlHandleType
Definition: DLTools.H:14
ObjectType *(* _create)()
Definition: DLTools.H:19
virtual dlHandleType Handle() const
Definition: DLTools.H:40
virtual int Load(const std::string &name, const std::string &path)
Definition: DLTools.H:70
virtual std::string & File()
Definition: DLTools.H:44
virtual void Unload()
Definition: DLTools.H:83
virtual ObjectFactory< ObjectType > Factory() const
Definition: DLTools.H:47
virtual void Destroy(ObjectType *objptr)
Definition: DLTools.H:27
virtual void SetDestroy(void(*indestroy)(ObjectType *))
Definition: DLTools.H:29
virtual ObjectType * Create()
Definition: DLTools.H:24
virtual ObjectType * CreateObject(const std::string &objectname)
Definition: DLTools.H:48
std::string _path
Definition: DLTools.H:37