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 #include "configmgr_p.h"
00031
00032 #include <gwenhywfar/gwenhywfar.h>
00033 #include <gwenhywfar/misc.h>
00034 #include <gwenhywfar/url.h>
00035 #include <gwenhywfar/debug.h>
00036
00037
00038 #include <stdlib.h>
00039 #include <assert.h>
00040 #include <string.h>
00041 #include <errno.h>
00042 #include <ctype.h>
00043
00044
00045
00046 GWEN_INHERIT_FUNCTIONS(GWEN_CONFIGMGR)
00047
00048 GWEN_INHERIT(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN)
00049
00050
00051
00052 int GWEN_ConfigMgr_ModuleInit(){
00053 GWEN_PLUGIN_MANAGER *pm;
00054 int err;
00055 GWEN_STRINGLIST *sl;
00056
00057 pm=GWEN_PluginManager_new(GWEN_CONFIGMGR_PLUGIN_NAME, GWEN_PM_LIBNAME);
00058 err=GWEN_PluginManager_Register(pm);
00059 if (err) {
00060 DBG_ERROR(GWEN_LOGDOMAIN, "Could not register ConfigMgr plugin manager");
00061 return err;
00062 }
00063
00064
00065 sl=GWEN_PathManager_GetPaths(GWEN_PM_LIBNAME, GWEN_PM_PLUGINDIR);
00066 if (sl) {
00067 GWEN_STRINGLISTENTRY *se;
00068 GWEN_BUFFER *pbuf;
00069
00070 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
00071
00072 se=GWEN_StringList_FirstEntry(sl);
00073 while(se) {
00074 GWEN_Buffer_AppendString(pbuf, GWEN_StringListEntry_Data(se));
00075 GWEN_Buffer_AppendString(pbuf, GWEN_DIR_SEPARATOR_S GWEN_CONFIGMGR_FOLDER);
00076 DBG_INFO(GWEN_LOGDOMAIN, "Adding plugin path [%s]",
00077 GWEN_Buffer_GetStart(pbuf));
00078 GWEN_PluginManager_AddPath(pm, GWEN_PM_LIBNAME,
00079 GWEN_Buffer_GetStart(pbuf));
00080 GWEN_Buffer_Reset(pbuf);
00081 se=GWEN_StringListEntry_Next(se);
00082 }
00083 GWEN_Buffer_free(pbuf);
00084 GWEN_StringList_free(sl);
00085 }
00086
00087 return 0;
00088 }
00089
00090
00091
00092 int GWEN_ConfigMgr_ModuleFini(){
00093 GWEN_PLUGIN_MANAGER *pm;
00094
00095 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
00096 if (pm) {
00097 int rv;
00098
00099 rv=GWEN_PluginManager_Unregister(pm);
00100 if (rv) {
00101 DBG_ERROR(GWEN_LOGDOMAIN,
00102 "Could not unregister ConfigMgr plugin manager (%d)", rv);
00103 return rv;
00104 }
00105 else
00106 GWEN_PluginManager_free(pm);
00107 }
00108
00109 return 0;
00110 }
00111
00112
00113
00114
00115 GWEN_CONFIGMGR *GWEN_ConfigMgr_new(const char *url) {
00116 GWEN_CONFIGMGR *mgr;
00117
00118 GWEN_NEW_OBJECT(GWEN_CONFIGMGR, mgr);
00119 GWEN_INHERIT_INIT(GWEN_CONFIGMGR, mgr);
00120
00121 if (url)
00122 mgr->url=strdup(url);
00123
00124 return mgr;
00125 }
00126
00127
00128
00129 void GWEN_ConfigMgr_free(GWEN_CONFIGMGR *mgr) {
00130 if (mgr) {
00131 GWEN_INHERIT_FINI(GWEN_CONFIGMGR, mgr);
00132 free(mgr->url);
00133 GWEN_FREE_OBJECT(mgr);
00134 }
00135 }
00136
00137
00138
00139 GWEN_CONFIGMGR_GETGROUP_FN GWEN_ConfigMgr_SetGetGroupFn(GWEN_CONFIGMGR *mgr,
00140 GWEN_CONFIGMGR_GETGROUP_FN f) {
00141 GWEN_CONFIGMGR_GETGROUP_FN of;
00142
00143 assert(mgr);
00144 of=mgr->getGroupFn;
00145 mgr->getGroupFn=f;
00146
00147 return of;
00148 }
00149
00150
00151
00152 GWEN_CONFIGMGR_SETGROUP_FN GWEN_ConfigMgr_SetSetGroupFn(GWEN_CONFIGMGR *mgr,
00153 GWEN_CONFIGMGR_SETGROUP_FN f) {
00154 GWEN_CONFIGMGR_SETGROUP_FN of;
00155
00156 assert(mgr);
00157 of=mgr->setGroupFn;
00158 mgr->setGroupFn=f;
00159
00160 return of;
00161 }
00162
00163
00164
00165 GWEN_CONFIGMGR_LOCKGROUP_FN GWEN_ConfigMgr_SetLockGroupFn(GWEN_CONFIGMGR *mgr,
00166 GWEN_CONFIGMGR_LOCKGROUP_FN f) {
00167 GWEN_CONFIGMGR_LOCKGROUP_FN of;
00168
00169 assert(mgr);
00170 of=mgr->lockGroupFn;
00171 mgr->lockGroupFn=f;
00172
00173 return of;
00174 }
00175
00176
00177
00178 GWEN_CONFIGMGR_UNLOCKGROUP_FN GWEN_ConfigMgr_SetUnlockGroupFn(GWEN_CONFIGMGR *mgr,
00179 GWEN_CONFIGMGR_UNLOCKGROUP_FN f) {
00180 GWEN_CONFIGMGR_UNLOCKGROUP_FN of;
00181
00182 assert(mgr);
00183 of=mgr->unlockGroupFn;
00184 mgr->unlockGroupFn=f;
00185
00186 return of;
00187 }
00188
00189
00190
00191 GWEN_CONFIGMGR_GETUNIQUEID_FN GWEN_ConfigMgr_SetGetUniqueIdFn(GWEN_CONFIGMGR *mgr,
00192 GWEN_CONFIGMGR_GETUNIQUEID_FN f) {
00193 GWEN_CONFIGMGR_GETUNIQUEID_FN of;
00194
00195 assert(mgr);
00196 of=mgr->getUniqueIdFn;
00197 mgr->getUniqueIdFn=f;
00198
00199 return of;
00200 }
00201
00202
00203
00204 GWEN_CONFIGMGR_DELETEGROUP_FN GWEN_ConfigMgr_SetDeleteGroupFn(GWEN_CONFIGMGR *mgr,
00205 GWEN_CONFIGMGR_DELETEGROUP_FN f) {
00206 GWEN_CONFIGMGR_DELETEGROUP_FN of;
00207
00208 assert(mgr);
00209 of=mgr->deleteGroupFn;
00210 mgr->deleteGroupFn=f;
00211
00212 return of;
00213 }
00214
00215
00216
00217 GWEN_CONFIGMGR_LISTGROUPS_FN GWEN_ConfigMgr_SetListGroupsFn(GWEN_CONFIGMGR *mgr,
00218 GWEN_CONFIGMGR_LISTGROUPS_FN f) {
00219 GWEN_CONFIGMGR_LISTGROUPS_FN of;
00220
00221 assert(mgr);
00222 of=mgr->listGroupsFn;
00223 mgr->listGroupsFn=f;
00224
00225 return of;
00226 }
00227
00228
00229
00230 GWEN_CONFIGMGR_LISTSUBGROUPS_FN GWEN_ConfigMgr_SetListSubGroupsFn(GWEN_CONFIGMGR *mgr,
00231 GWEN_CONFIGMGR_LISTSUBGROUPS_FN f) {
00232 GWEN_CONFIGMGR_LISTSUBGROUPS_FN of;
00233
00234 assert(mgr);
00235 of=mgr->listSubGroupsFn;
00236 mgr->listSubGroupsFn=f;
00237
00238 return of;
00239 }
00240
00241
00242
00243 int GWEN_ConfigMgr_GetGroup(GWEN_CONFIGMGR *mgr,
00244 const char *groupName,
00245 const char *subGroupName,
00246 GWEN_DB_NODE **pDb,
00247 uint32_t guiid) {
00248 assert(mgr);
00249 if (mgr->getGroupFn)
00250 return mgr->getGroupFn(mgr, groupName, subGroupName, pDb, guiid);
00251 else
00252 return GWEN_ERROR_NOT_IMPLEMENTED;
00253 }
00254
00255
00256
00257 int GWEN_ConfigMgr_SetGroup(GWEN_CONFIGMGR *mgr,
00258 const char *groupName,
00259 const char *subGroupName,
00260 GWEN_DB_NODE *db,
00261 uint32_t guiid) {
00262 assert(mgr);
00263 if (mgr->setGroupFn)
00264 return mgr->setGroupFn(mgr, groupName, subGroupName, db, guiid);
00265 else
00266 return GWEN_ERROR_NOT_IMPLEMENTED;
00267 }
00268
00269
00270
00271 int GWEN_ConfigMgr_LockGroup(GWEN_CONFIGMGR *mgr,
00272 const char *groupName,
00273 const char *subGroupName,
00274 uint32_t guiid) {
00275 assert(mgr);
00276 if (mgr->lockGroupFn)
00277 return mgr->lockGroupFn(mgr, groupName, subGroupName, guiid);
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 uint32_t guiid) {
00288 assert(mgr);
00289 if (mgr->unlockGroupFn)
00290 return mgr->unlockGroupFn(mgr, groupName, subGroupName, guiid);
00291 else
00292 return GWEN_ERROR_NOT_IMPLEMENTED;
00293 }
00294
00295
00296
00297 int GWEN_ConfigMgr_GetUniqueId(GWEN_CONFIGMGR *mgr,
00298 const char *groupName,
00299 char *buffer,
00300 uint32_t bufferLen,
00301 uint32_t guiid) {
00302 assert(mgr);
00303 if (mgr->getUniqueIdFn)
00304 return mgr->getUniqueIdFn(mgr, groupName, buffer, bufferLen, guiid);
00305 else
00306 return GWEN_ERROR_NOT_IMPLEMENTED;
00307 }
00308
00309
00310
00311 int GWEN_ConfigMgr_DeleteGroup(GWEN_CONFIGMGR *mgr,
00312 const char *groupName,
00313 const char *subGroupName,
00314 uint32_t guiid) {
00315 assert(mgr);
00316 if (mgr->deleteGroupFn)
00317 return mgr->deleteGroupFn(mgr, groupName, subGroupName, guiid);
00318 else
00319 return GWEN_ERROR_NOT_IMPLEMENTED;
00320 }
00321
00322
00323
00324 int GWEN_ConfigMgr_ListGroups(GWEN_CONFIGMGR *mgr,
00325 GWEN_STRINGLIST *sl,
00326 uint32_t guiid) {
00327 assert(mgr);
00328 if (mgr->listGroupsFn)
00329 return mgr->listGroupsFn(mgr, sl, guiid);
00330 else
00331 return GWEN_ERROR_NOT_IMPLEMENTED;
00332 }
00333
00334
00335 int GWEN_ConfigMgr_ListSubGroups(GWEN_CONFIGMGR *mgr,
00336 const char *groupName,
00337 GWEN_STRINGLIST *sl,
00338 uint32_t guiid) {
00339 assert(mgr);
00340 if (mgr->listSubGroupsFn)
00341 return mgr->listSubGroupsFn(mgr, groupName, sl, guiid);
00342 else
00343 return GWEN_ERROR_NOT_IMPLEMENTED;
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 GWEN_PLUGIN *GWEN_ConfigMgr_Plugin_new(GWEN_PLUGIN_MANAGER *pm,
00355 const char *name,
00356 const char *fileName) {
00357 GWEN_PLUGIN *pl;
00358 GWEN_CONFIGMGR_PLUGIN *xpl;
00359
00360 pl=GWEN_Plugin_new(pm, name, fileName);
00361 GWEN_NEW_OBJECT(GWEN_CONFIGMGR_PLUGIN, xpl);
00362 GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl, xpl,
00363 GWEN_ConfigMgr_Plugin_FreeData);
00364
00365 return pl;
00366 }
00367
00368
00369
00370 void GWENHYWFAR_CB GWEN_ConfigMgr_Plugin_FreeData(GWEN_UNUSED void *bp, void *p) {
00371 GWEN_CONFIGMGR_PLUGIN *xpl;
00372
00373 xpl=(GWEN_CONFIGMGR_PLUGIN*)p;
00374 GWEN_FREE_OBJECT(xpl);
00375 }
00376
00377
00378
00379 void GWEN_ConfigMgr_Plugin_SetFactoryFn(GWEN_PLUGIN *pl,
00380 GWEN_CONFIGMGR_PLUGIN_FACTORYFN f) {
00381 GWEN_CONFIGMGR_PLUGIN *xpl;
00382
00383 assert(pl);
00384 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
00385 assert(xpl);
00386
00387 xpl->factoryFn=f;
00388 }
00389
00390
00391
00392 GWEN_CONFIGMGR *GWEN_ConfigMgr_Plugin_Factory(GWEN_PLUGIN *pl,
00393 const char *url) {
00394 GWEN_CONFIGMGR_PLUGIN *xpl;
00395
00396 assert(pl);
00397 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
00398 assert(xpl);
00399
00400 assert(xpl->factoryFn);
00401 return xpl->factoryFn(pl, url);
00402 }
00403
00404
00405
00406 GWEN_CONFIGMGR *GWEN_ConfigMgr_Factory(const char *url) {
00407 GWEN_PLUGIN_MANAGER *pm;
00408 GWEN_PLUGIN *pl;
00409 GWEN_CONFIGMGR *mgr=NULL;
00410 GWEN_URL *purl;
00411 const char *modname;
00412
00413 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
00414 if (!pm) {
00415 DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"ConfigMgr\" found");
00416 return 0;
00417 }
00418
00419 purl=GWEN_Url_fromString(url);
00420 if (purl==NULL) {
00421 DBG_INFO(GWEN_LOGDOMAIN, "Invalid url [%s]", url);
00422 return NULL;
00423 }
00424
00425 modname=GWEN_Url_GetProtocol(purl);
00426 if (modname==NULL)
00427 modname="file";
00428
00429 pl=GWEN_PluginManager_GetPlugin(pm, modname);
00430 if (!pl) {
00431 DBG_INFO(GWEN_LOGDOMAIN, "ConfigMgr-Plugin \"%s\" not found", modname);
00432 GWEN_Url_free(purl);
00433 return 0;
00434 }
00435 GWEN_Url_free(purl);
00436
00437 mgr=GWEN_ConfigMgr_Plugin_Factory(pl, url);
00438 if (mgr==NULL) {
00439 DBG_INFO(GWEN_LOGDOMAIN,
00440 "Plugin did not create a GWEN_CONFIGMGR");
00441 }
00442
00443 return mgr;
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453