]> git.stg.codes - stg.git/blob - stargazer/store_loader.cpp
1529a2ccd7c5fb744bff2de7e95fead20a75aafd
[stg.git] / stargazer / store_loader.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
19  */
20
21 /*
22  $Revision: 1.6 $
23  $Date: 2010/03/04 12:24:19 $
24  $Author: faust $
25  */
26
27 /*
28  *  An implementation of RAII store plugin loader
29  */
30
31 #include <dlfcn.h>
32
33 #include "stg/common.h"
34 #include "stg/store.h"
35 #include "store_loader.h"
36 #include "settings_impl.h"
37
38 STORE_LOADER::STORE_LOADER(const SETTINGS_IMPL & settings)
39     : isLoaded(false),
40       handle(NULL),
41       plugin(NULL),
42       errorStr(),
43       storeSettings(settings.GetStoreModuleSettings()),
44       pluginFileName(settings.GetModulesPath() + "/mod_" + storeSettings.moduleName + ".so")
45 {
46 }
47
48 STORE_LOADER::~STORE_LOADER()
49 {
50 Unload();
51 }
52
53 bool STORE_LOADER::Load()
54 {
55 if (isLoaded)
56     {
57     errorStr = "Store plugin '" + pluginFileName + "' was already loaded!";
58     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
59     return false;
60     }
61
62 if (pluginFileName.empty())
63     {
64     errorStr = "Empty store plugin filename";
65     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
66     return true;
67     }
68
69 handle = dlopen(pluginFileName.c_str(), RTLD_NOW);
70
71 if (!handle)
72     {
73     errorStr = "Error loading plugin '"
74         + pluginFileName + "': '" + dlerror() + "'";
75     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
76     return true;
77     }
78
79 isLoaded = true;
80
81 STORE * (*GetStore)();
82 GetStore = reinterpret_cast<STORE * (*)()>(dlsym(handle, "GetStore"));
83 if (!GetStore)
84     {
85     errorStr = std::string("GetStore() not found! ") + dlerror();
86     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
87     return true;
88     }
89
90 plugin = GetStore();
91
92 if (!plugin)
93     {
94     errorStr = "Plugin was not created!";
95     printfd(__FILE__, "STORE_LOADER::Load() - %s\n");
96     return true;
97     }
98
99 plugin->SetSettings(storeSettings);
100 if (plugin->ParseSettings())
101     {
102     errorStr = plugin->GetStrError();
103     printfd(__FILE__, "STORE_LOADER::Load() - Failed to parse settings. Plugin reports: '%s'\n", errorStr.c_str());
104     return true;
105     }
106
107 return false;
108 }
109
110 bool STORE_LOADER::Unload()
111 {
112 printfd(__FILE__, "STORE_LOADER::Unload()\n");
113 if (!isLoaded)
114     {
115     return true;
116     }
117
118 delete plugin;
119
120 if (dlclose(handle))
121     {
122     errorStr = "Failed to unload plugin '";
123     errorStr += pluginFileName + "': ";
124     errorStr += dlerror();
125     printfd(__FILE__, "STORE_LOADER::Unload() - %s\n", errorStr.c_str());
126     return true;
127     }
128
129 isLoaded = false;
130
131 return false;
132 }