00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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