gwenhywfar
4.3.3
|
00001 /*************************************************************************** 00002 begin : Mon Aug 11 2008 00003 copyright : (C) 2008 by Martin Preuss 00004 email : martin@libchipcard.de 00005 00006 *************************************************************************** 00007 * * 00008 * This library is free software; you can redistribute it and/or * 00009 * modify it under the terms of the GNU Lesser General Public * 00010 * License as published by the Free Software Foundation; either * 00011 * version 2.1 of the License, or (at your option) any later version. * 00012 * * 00013 * This library is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00016 * Lesser General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU Lesser General Public * 00019 * License along with this library; if not, write to the Free Software * 00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * 00021 * MA 02111-1307 USA * 00022 * * 00023 ***************************************************************************/ 00024 00025 00026 #ifdef HAVE_CONFIG_H 00027 # include <config.h> 00028 #endif 00029 00030 #define DISABLE_DEBUGLOG 00031 00032 00033 #include "configmgr_p.h" 00034 00035 #include <gwenhywfar/gwenhywfar.h> 00036 #include <gwenhywfar/misc.h> 00037 #include <gwenhywfar/url.h> 00038 #include <gwenhywfar/debug.h> 00039 00040 00041 #include <stdlib.h> 00042 #include <assert.h> 00043 #include <string.h> 00044 #include <errno.h> 00045 #include <ctype.h> 00046 00047 00048 00049 GWEN_INHERIT_FUNCTIONS(GWEN_CONFIGMGR) 00050 00051 GWEN_INHERIT(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN) 00052 00053 00054 00055 int GWEN_ConfigMgr_ModuleInit(void){ 00056 GWEN_PLUGIN_MANAGER *pm; 00057 int err; 00058 GWEN_STRINGLIST *sl; 00059 00060 pm=GWEN_PluginManager_new(GWEN_CONFIGMGR_PLUGIN_NAME, GWEN_PM_LIBNAME); 00061 err=GWEN_PluginManager_Register(pm); 00062 if (err) { 00063 DBG_ERROR(GWEN_LOGDOMAIN, "Could not register ConfigMgr plugin manager"); 00064 return err; 00065 } 00066 00067 /* create plugin paths */ 00068 sl=GWEN_PathManager_GetPaths(GWEN_PM_LIBNAME, GWEN_PM_PLUGINDIR); 00069 if (sl) { 00070 GWEN_STRINGLISTENTRY *se; 00071 GWEN_BUFFER *pbuf; 00072 00073 pbuf=GWEN_Buffer_new(0, 256, 0, 1); 00074 00075 se=GWEN_StringList_FirstEntry(sl); 00076 while(se) { 00077 GWEN_Buffer_AppendString(pbuf, GWEN_StringListEntry_Data(se)); 00078 GWEN_Buffer_AppendString(pbuf, GWEN_DIR_SEPARATOR_S GWEN_CONFIGMGR_FOLDER); 00079 DBG_INFO(GWEN_LOGDOMAIN, "Adding plugin path [%s]", 00080 GWEN_Buffer_GetStart(pbuf)); 00081 GWEN_PluginManager_AddPath(pm, GWEN_PM_LIBNAME, 00082 GWEN_Buffer_GetStart(pbuf)); 00083 GWEN_Buffer_Reset(pbuf); 00084 se=GWEN_StringListEntry_Next(se); 00085 } 00086 GWEN_Buffer_free(pbuf); 00087 GWEN_StringList_free(sl); 00088 } 00089 00090 return 0; 00091 } 00092 00093 00094 00095 int GWEN_ConfigMgr_ModuleFini(void){ 00096 GWEN_PLUGIN_MANAGER *pm; 00097 00098 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME); 00099 if (pm) { 00100 int rv; 00101 00102 rv=GWEN_PluginManager_Unregister(pm); 00103 if (rv) { 00104 DBG_ERROR(GWEN_LOGDOMAIN, 00105 "Could not unregister ConfigMgr plugin manager (%d)", rv); 00106 return rv; 00107 } 00108 else 00109 GWEN_PluginManager_free(pm); 00110 } 00111 00112 return 0; 00113 } 00114 00115 00116 00117 00118 GWEN_CONFIGMGR *GWEN_ConfigMgr_new(const char *url) { 00119 GWEN_CONFIGMGR *mgr; 00120 00121 GWEN_NEW_OBJECT(GWEN_CONFIGMGR, mgr); 00122 GWEN_INHERIT_INIT(GWEN_CONFIGMGR, mgr); 00123 00124 if (url) 00125 mgr->url=strdup(url); 00126 00127 return mgr; 00128 } 00129 00130 00131 00132 void GWEN_ConfigMgr_free(GWEN_CONFIGMGR *mgr) { 00133 if (mgr) { 00134 GWEN_INHERIT_FINI(GWEN_CONFIGMGR, mgr); 00135 free(mgr->url); 00136 GWEN_FREE_OBJECT(mgr); 00137 } 00138 } 00139 00140 00141 00142 GWEN_CONFIGMGR_GETGROUP_FN GWEN_ConfigMgr_SetGetGroupFn(GWEN_CONFIGMGR *mgr, 00143 GWEN_CONFIGMGR_GETGROUP_FN f) { 00144 GWEN_CONFIGMGR_GETGROUP_FN of; 00145 00146 assert(mgr); 00147 of=mgr->getGroupFn; 00148 mgr->getGroupFn=f; 00149 00150 return of; 00151 } 00152 00153 00154 00155 GWEN_CONFIGMGR_SETGROUP_FN GWEN_ConfigMgr_SetSetGroupFn(GWEN_CONFIGMGR *mgr, 00156 GWEN_CONFIGMGR_SETGROUP_FN f) { 00157 GWEN_CONFIGMGR_SETGROUP_FN of; 00158 00159 assert(mgr); 00160 of=mgr->setGroupFn; 00161 mgr->setGroupFn=f; 00162 00163 return of; 00164 } 00165 00166 00167 00168 GWEN_CONFIGMGR_LOCKGROUP_FN GWEN_ConfigMgr_SetLockGroupFn(GWEN_CONFIGMGR *mgr, 00169 GWEN_CONFIGMGR_LOCKGROUP_FN f) { 00170 GWEN_CONFIGMGR_LOCKGROUP_FN of; 00171 00172 assert(mgr); 00173 of=mgr->lockGroupFn; 00174 mgr->lockGroupFn=f; 00175 00176 return of; 00177 } 00178 00179 00180 00181 GWEN_CONFIGMGR_UNLOCKGROUP_FN GWEN_ConfigMgr_SetUnlockGroupFn(GWEN_CONFIGMGR *mgr, 00182 GWEN_CONFIGMGR_UNLOCKGROUP_FN f) { 00183 GWEN_CONFIGMGR_UNLOCKGROUP_FN of; 00184 00185 assert(mgr); 00186 of=mgr->unlockGroupFn; 00187 mgr->unlockGroupFn=f; 00188 00189 return of; 00190 } 00191 00192 00193 00194 GWEN_CONFIGMGR_GETUNIQUEID_FN GWEN_ConfigMgr_SetGetUniqueIdFn(GWEN_CONFIGMGR *mgr, 00195 GWEN_CONFIGMGR_GETUNIQUEID_FN f) { 00196 GWEN_CONFIGMGR_GETUNIQUEID_FN of; 00197 00198 assert(mgr); 00199 of=mgr->getUniqueIdFn; 00200 mgr->getUniqueIdFn=f; 00201 00202 return of; 00203 } 00204 00205 00206 00207 GWEN_CONFIGMGR_DELETEGROUP_FN GWEN_ConfigMgr_SetDeleteGroupFn(GWEN_CONFIGMGR *mgr, 00208 GWEN_CONFIGMGR_DELETEGROUP_FN f) { 00209 GWEN_CONFIGMGR_DELETEGROUP_FN of; 00210 00211 assert(mgr); 00212 of=mgr->deleteGroupFn; 00213 mgr->deleteGroupFn=f; 00214 00215 return of; 00216 } 00217 00218 00219 00220 GWEN_CONFIGMGR_LISTGROUPS_FN GWEN_ConfigMgr_SetListGroupsFn(GWEN_CONFIGMGR *mgr, 00221 GWEN_CONFIGMGR_LISTGROUPS_FN f) { 00222 GWEN_CONFIGMGR_LISTGROUPS_FN of; 00223 00224 assert(mgr); 00225 of=mgr->listGroupsFn; 00226 mgr->listGroupsFn=f; 00227 00228 return of; 00229 } 00230 00231 00232 00233 GWEN_CONFIGMGR_LISTSUBGROUPS_FN GWEN_ConfigMgr_SetListSubGroupsFn(GWEN_CONFIGMGR *mgr, 00234 GWEN_CONFIGMGR_LISTSUBGROUPS_FN f) { 00235 GWEN_CONFIGMGR_LISTSUBGROUPS_FN of; 00236 00237 assert(mgr); 00238 of=mgr->listSubGroupsFn; 00239 mgr->listSubGroupsFn=f; 00240 00241 return of; 00242 } 00243 00244 00245 00246 int GWEN_ConfigMgr_GetGroup(GWEN_CONFIGMGR *mgr, 00247 const char *groupName, 00248 const char *subGroupName, 00249 GWEN_DB_NODE **pDb) { 00250 assert(mgr); 00251 if (mgr->getGroupFn) 00252 return mgr->getGroupFn(mgr, groupName, subGroupName, pDb); 00253 else 00254 return GWEN_ERROR_NOT_IMPLEMENTED; 00255 } 00256 00257 00258 00259 int GWEN_ConfigMgr_SetGroup(GWEN_CONFIGMGR *mgr, 00260 const char *groupName, 00261 const char *subGroupName, 00262 GWEN_DB_NODE *db) { 00263 assert(mgr); 00264 if (mgr->setGroupFn) 00265 return mgr->setGroupFn(mgr, groupName, subGroupName, db); 00266 else 00267 return GWEN_ERROR_NOT_IMPLEMENTED; 00268 } 00269 00270 00271 00272 int GWEN_ConfigMgr_LockGroup(GWEN_CONFIGMGR *mgr, 00273 const char *groupName, 00274 const char *subGroupName) { 00275 assert(mgr); 00276 if (mgr->lockGroupFn) 00277 return mgr->lockGroupFn(mgr, groupName, subGroupName); 00278 else 00279 return GWEN_ERROR_NOT_IMPLEMENTED; 00280 } 00281 00282 00283 00284 int GWEN_ConfigMgr_UnlockGroup(GWEN_CONFIGMGR *mgr, 00285 const char *groupName, 00286 const char *subGroupName) { 00287 assert(mgr); 00288 if (mgr->unlockGroupFn) 00289 return mgr->unlockGroupFn(mgr, groupName, subGroupName); 00290 else 00291 return GWEN_ERROR_NOT_IMPLEMENTED; 00292 } 00293 00294 00295 00296 int GWEN_ConfigMgr_GetUniqueId(GWEN_CONFIGMGR *mgr, 00297 const char *groupName, 00298 char *buffer, 00299 uint32_t bufferLen) { 00300 assert(mgr); 00301 if (mgr->getUniqueIdFn) 00302 return mgr->getUniqueIdFn(mgr, groupName, buffer, bufferLen); 00303 else 00304 return GWEN_ERROR_NOT_IMPLEMENTED; 00305 } 00306 00307 00308 00309 int GWEN_ConfigMgr_DeleteGroup(GWEN_CONFIGMGR *mgr, 00310 const char *groupName, 00311 const char *subGroupName) { 00312 assert(mgr); 00313 if (mgr->deleteGroupFn) 00314 return mgr->deleteGroupFn(mgr, groupName, subGroupName); 00315 else 00316 return GWEN_ERROR_NOT_IMPLEMENTED; 00317 } 00318 00319 00320 00321 int GWEN_ConfigMgr_ListGroups(GWEN_CONFIGMGR *mgr, 00322 GWEN_STRINGLIST *sl) { 00323 assert(mgr); 00324 if (mgr->listGroupsFn) 00325 return mgr->listGroupsFn(mgr, sl); 00326 else 00327 return GWEN_ERROR_NOT_IMPLEMENTED; 00328 } 00329 00330 00331 int GWEN_ConfigMgr_ListSubGroups(GWEN_CONFIGMGR *mgr, 00332 const char *groupName, 00333 GWEN_STRINGLIST *sl) { 00334 assert(mgr); 00335 if (mgr->listSubGroupsFn) 00336 return mgr->listSubGroupsFn(mgr, groupName, sl); 00337 else 00338 return GWEN_ERROR_NOT_IMPLEMENTED; 00339 } 00340 00341 00342 00343 00344 00345 00346 00347 00348 00349 GWEN_PLUGIN *GWEN_ConfigMgr_Plugin_new(GWEN_PLUGIN_MANAGER *pm, 00350 const char *name, 00351 const char *fileName) { 00352 GWEN_PLUGIN *pl; 00353 GWEN_CONFIGMGR_PLUGIN *xpl; 00354 00355 pl=GWEN_Plugin_new(pm, name, fileName); 00356 GWEN_NEW_OBJECT(GWEN_CONFIGMGR_PLUGIN, xpl); 00357 GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl, xpl, 00358 GWEN_ConfigMgr_Plugin_FreeData); 00359 00360 return pl; 00361 } 00362 00363 00364 00365 void GWENHYWFAR_CB GWEN_ConfigMgr_Plugin_FreeData(GWEN_UNUSED void *bp, void *p) { 00366 GWEN_CONFIGMGR_PLUGIN *xpl; 00367 00368 xpl=(GWEN_CONFIGMGR_PLUGIN*)p; 00369 GWEN_FREE_OBJECT(xpl); 00370 } 00371 00372 00373 00374 void GWEN_ConfigMgr_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, 00375 GWEN_CONFIGMGR_PLUGIN_FACTORYFN f) { 00376 GWEN_CONFIGMGR_PLUGIN *xpl; 00377 00378 assert(pl); 00379 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl); 00380 assert(xpl); 00381 00382 xpl->factoryFn=f; 00383 } 00384 00385 00386 00387 GWEN_CONFIGMGR *GWEN_ConfigMgr_Plugin_Factory(GWEN_PLUGIN *pl, 00388 const char *url) { 00389 GWEN_CONFIGMGR_PLUGIN *xpl; 00390 00391 assert(pl); 00392 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl); 00393 assert(xpl); 00394 00395 assert(xpl->factoryFn); 00396 return xpl->factoryFn(pl, url); 00397 } 00398 00399 00400 00401 GWEN_CONFIGMGR *GWEN_ConfigMgr_Factory(const char *url) { 00402 GWEN_PLUGIN_MANAGER *pm; 00403 GWEN_PLUGIN *pl; 00404 GWEN_CONFIGMGR *mgr=NULL; 00405 GWEN_URL *purl; 00406 const char *modname; 00407 00408 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME); 00409 if (!pm) { 00410 DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"ConfigMgr\" found"); 00411 return 0; 00412 } 00413 00414 purl=GWEN_Url_fromString(url); 00415 if (purl==NULL) { 00416 DBG_INFO(GWEN_LOGDOMAIN, "Invalid url [%s]", url); 00417 return NULL; 00418 } 00419 00420 modname=GWEN_Url_GetProtocol(purl); 00421 if (modname==NULL) 00422 modname="file"; 00423 00424 pl=GWEN_PluginManager_GetPlugin(pm, modname); 00425 if (!pl) { 00426 DBG_INFO(GWEN_LOGDOMAIN, "ConfigMgr-Plugin \"%s\" not found", modname); 00427 GWEN_Url_free(purl); 00428 return 0; 00429 } 00430 GWEN_Url_free(purl); 00431 00432 mgr=GWEN_ConfigMgr_Plugin_Factory(pl, url); 00433 if (mgr==NULL) { 00434 DBG_INFO(GWEN_LOGDOMAIN, 00435 "Plugin did not create a GWEN_CONFIGMGR"); 00436 } 00437 00438 return mgr; 00439 } 00440 00441 00442 00443 00444 00445 00446 00447 00448