bes Updated for version 3.20.13
BESPlugin.h
1// BESPlugin.h
2
3// This file is part of bes, A C++ back-end server implementation framework
4// for the OPeNDAP Data Access Protocol.
5
6// Copyright (c) 2004-2009 University Corporation for Atmospheric Research
7// Author: Patrick West <pwest@ucar.edu> and Jose Garcia <jgarcia@ucar.edu>
8// and James Gallagher <jgallagher@gso.uri.edu>
9//
10// This library is free software; you can redistribute it and/or
11// modify it under the terms of the GNU Lesser General Public
12// License as published by the Free Software Foundation; either
13// version 2.1 of the License, or (at your option) any later version.
14//
15// This library is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18// Lesser General Public License for more details.
19//
20// You should have received a copy of the GNU Lesser General Public
21// License along with this library; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23//
24// You can contact University Corporation for Atmospheric Research at
25// 3080 Center Green Drive, Boulder, CO 80301
26
27// (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005
28// Please read the full copyright statement in the file COPYRIGHT_UCAR.
29//
30// Authors:
31// pwest Patrick West <pwest@ucar.edu>
32// jgarcia Jose Garcia <jgarcia@ucar.edu>
33// jimg James Gallagher <jgallagher@gso.uri.edu>
34
35#ifndef T_BESPlugin_h
36#define T_BESPlugin_h
37
38#include <dlfcn.h>
39#include <string>
40#include <iostream>
41
42#include "BESObj.h"
43#include "BESInternalFatalError.h"
44#include "BESInternalError.h"
45#include "BESDebug.h"
46
47#undef UNPLUG_HANDLERS
48
53public:
54 NoSuchLibrary(const std::string &msg, const std::string &file, int line) :
55 BESInternalFatalError(msg, file, line)
56 {
57 }
58};
59
64public:
65 NoSuchObject(const std::string &msg, const std::string &file, int line) :
66 BESInternalFatalError(msg, file, line)
67 {
68 }
69};
70
91template<typename M>
92class BESPlugin: public BESObj {
93private:
94 std::string d_filename; // Library filename
95 void *d_lib; // Open library handle
96
99 BESPlugin();
100#if 0
101 throw (BESInternalError)
102 {
103 throw BESInternalError("Unimplemented method", __FILE__, __LINE__);
104 }
105#endif
110 BESPlugin(const BESPlugin &p);
111#if 0
112 throw (BESInternalError)
113 {
114 throw BESInternalError("Unimplemented method.", __FILE__, __LINE__);
115 }
116#endif
120 BESPlugin &operator=(const BESPlugin &p);
121#if 0
122 throw (BESInternalError)
123 {
124 throw BESInternalError("Unimplemented method.", __FILE__, __LINE__);
125 }
126#endif
127 void *get_lib() throw (NoSuchLibrary)
128 {
129 if (!d_lib) {
130 d_lib = dlopen(d_filename.c_str(), RTLD_LAZY /*RTLD_NOW*/ | RTLD_GLOBAL);
131 BESDEBUG( "bes", "BESPlugin: plug in handler:" << d_filename << ", " << d_lib << std::endl);
132 if (d_lib == NULL) {
133 throw NoSuchLibrary(std::string(dlerror()), __FILE__, __LINE__);
134 }
135 }
136
137 return d_lib;
138 }
139
140public:
145 BESPlugin(const std::string &filename) :
146 d_filename(filename), d_lib(0)
147 {
148 }
149
152 virtual ~BESPlugin()
153 {
154 BESDEBUG( "bes", "BESPlugin: unplugging handler:" << d_filename << ", " << d_lib << std::endl);
155#ifdef UNPLUG_HANDLERS
156 if (d_lib) {
157 dlclose(d_lib);
158 d_lib = 0; // Added; paranoia. jhrg
159 }
160#endif
161 }
162
170 {
171 void *maker = dlsym(get_lib(), "maker");
172 if (!maker) {
173 throw NoSuchObject(std::string(dlerror()), __FILE__, __LINE__);
174 }
175
176 typedef M *(*maker_func_ptr)();
177 maker_func_ptr my_maker = *reinterpret_cast<maker_func_ptr*>(&maker);
178 M *my_M = (my_maker)();
179
180 return my_M;
181 }
182
183 virtual void dump(std::ostream &strm) const
184 {
185 strm << "BESPlugin::dump - (" << (void *) this << ")" << std::endl;
186 strm << " plugin name: " << d_filename << std::endl;
187 strm << " library handle: " << (void *) d_lib << std::endl;
188 }
189};
190
191#endif // T_BESPlugin_h
exception thrown if internal error encountered
exception thrown if an internal error is found and is fatal to the BES
top level BES object to house generic methods
Definition BESObj.h:54
virtual ~BESPlugin()
Definition BESPlugin.h:152
virtual void dump(std::ostream &strm) const
dump the contents of this object to the specified ostream
Definition BESPlugin.h:183
BESPlugin(const std::string &filename)
Definition BESPlugin.h:145
M * instantiate()
Definition BESPlugin.h:169