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 }
00085
00086 return 0;
00087 }
00088
00089
00090
00091 int GWEN_ConfigMgr_ModuleFini(){
00092 GWEN_PLUGIN_MANAGER *pm;
00093
00094 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
00095 if (pm) {
00096 int rv;
00097
00098 rv=GWEN_PluginManager_Unregister(pm);
00099 if (rv) {
00100 DBG_ERROR(GWEN_LOGDOMAIN,
00101 "Could not unregister ConfigMgr plugin manager (%d)", rv);
00102 return rv;
00103 }
00104 else
00105 GWEN_PluginManager_free(pm);
00106 }
00107
00108 return 0;
00109 }
00110
00111
00112
00113
00114 GWEN_CONFIGMGR *GWEN_ConfigMgr_new(const char *url) {
00115 GWEN_CONFIGMGR *mgr;
00116
00117 GWEN_NEW_OBJECT(GWEN_CONFIGMGR, mgr);
00118 GWEN_INHERIT_INIT(GWEN_CONFIGMGR, mgr);
00119
00120 if (url)
00121 mgr->url=strdup(url);
00122
00123 return mgr;
00124 }
00125
00126
00127
00128 void GWEN_ConfigMgr_free(GWEN_CONFIGMGR *mgr) {
00129 if (mgr) {
00130 GWEN_INHERIT_FINI(GWEN_CONFIGMGR, mgr);
00131 free(mgr->url);
00132 GWEN_FREE_OBJECT(mgr);
00133 }
00134 }
00135
00136
00137
00138 GWEN_CONFIGMGR_GETGROUP_FN GWEN_ConfigMgr_SetGetGroupFn(GWEN_CONFIGMGR *mgr,
00139 GWEN_CONFIGMGR_GETGROUP_FN f) {
00140 GWEN_CONFIGMGR_GETGROUP_FN of;
00141
00142 assert(mgr);
00143 of=mgr->getGroupFn;
00144 mgr->getGroupFn=f;
00145
00146 return of;
00147 }
00148
00149
00150
00151 GWEN_CONFIGMGR_SETGROUP_FN GWEN_ConfigMgr_SetSetGroupFn(GWEN_CONFIGMGR *mgr,
00152 GWEN_CONFIGMGR_SETGROUP_FN f) {
00153 GWEN_CONFIGMGR_SETGROUP_FN of;
00154
00155 assert(mgr);
00156 of=mgr->setGroupFn;
00157 mgr->setGroupFn=f;
00158
00159 return of;
00160 }
00161
00162
00163
00164 GWEN_CONFIGMGR_LOCKGROUP_FN GWEN_ConfigMgr_SetLockGroupFn(GWEN_CONFIGMGR *mgr,
00165 GWEN_CONFIGMGR_LOCKGROUP_FN f) {
00166 GWEN_CONFIGMGR_LOCKGROUP_FN of;
00167
00168 assert(mgr);
00169 of=mgr->lockGroupFn;
00170 mgr->lockGroupFn=f;
00171
00172 return of;
00173 }
00174
00175
00176
00177 GWEN_CONFIGMGR_UNLOCKGROUP_FN GWEN_ConfigMgr_SetUnlockGroupFn(GWEN_CONFIGMGR *mgr,
00178 GWEN_CONFIGMGR_UNLOCKGROUP_FN f) {
00179 GWEN_CONFIGMGR_UNLOCKGROUP_FN of;
00180
00181 assert(mgr);
00182 of=mgr->unlockGroupFn;
00183 mgr->unlockGroupFn=f;
00184
00185 return of;
00186 }
00187
00188
00189
00190 GWEN_CONFIGMGR_DELETEGROUP_FN GWEN_ConfigMgr_SetDeleteGroupFn(GWEN_CONFIGMGR *mgr,
00191 GWEN_CONFIGMGR_DELETEGROUP_FN f) {
00192 GWEN_CONFIGMGR_DELETEGROUP_FN of;
00193
00194 assert(mgr);
00195 of=mgr->deleteGroupFn;
00196 mgr->deleteGroupFn=f;
00197
00198 return of;
00199 }
00200
00201
00202
00203 GWEN_CONFIGMGR_LISTGROUPS_FN GWEN_ConfigMgr_SetListGroupsFn(GWEN_CONFIGMGR *mgr,
00204 GWEN_CONFIGMGR_LISTGROUPS_FN f) {
00205 GWEN_CONFIGMGR_LISTGROUPS_FN of;
00206
00207 assert(mgr);
00208 of=mgr->listGroupsFn;
00209 mgr->listGroupsFn=f;
00210
00211 return of;
00212 }
00213
00214
00215
00216 GWEN_CONFIGMGR_LISTSUBGROUPS_FN GWEN_ConfigMgr_SetListSubGroupsFn(GWEN_CONFIGMGR *mgr,
00217 GWEN_CONFIGMGR_LISTSUBGROUPS_FN f) {
00218 GWEN_CONFIGMGR_LISTSUBGROUPS_FN of;
00219
00220 assert(mgr);
00221 of=mgr->listSubGroupsFn;
00222 mgr->listSubGroupsFn=f;
00223
00224 return of;
00225 }
00226
00227
00228
00229 int GWEN_ConfigMgr_GetGroup(GWEN_CONFIGMGR *mgr,
00230 const char *groupName,
00231 const char *subGroupName,
00232 GWEN_DB_NODE **pDb) {
00233 assert(mgr);
00234 if (mgr->getGroupFn)
00235 return mgr->getGroupFn(mgr, groupName, subGroupName, pDb);
00236 else
00237 return GWEN_ERROR_NOT_IMPLEMENTED;
00238 }
00239
00240
00241
00242 int GWEN_ConfigMgr_SetGroup(GWEN_CONFIGMGR *mgr,
00243 const char *groupName,
00244 const char *subGroupName,
00245 GWEN_DB_NODE *db) {
00246 assert(mgr);
00247 if (mgr->setGroupFn)
00248 return mgr->setGroupFn(mgr, groupName, subGroupName, db);
00249 else
00250 return GWEN_ERROR_NOT_IMPLEMENTED;
00251 }
00252
00253
00254
00255 int GWEN_ConfigMgr_LockGroup(GWEN_CONFIGMGR *mgr,
00256 const char *groupName,
00257 const char *subGroupName) {
00258 assert(mgr);
00259 if (mgr->lockGroupFn)
00260 return mgr->lockGroupFn(mgr, groupName, subGroupName);
00261 else
00262 return GWEN_ERROR_NOT_IMPLEMENTED;
00263 }
00264
00265
00266
00267 int GWEN_ConfigMgr_UnlockGroup(GWEN_CONFIGMGR *mgr,
00268 const char *groupName,
00269 const char *subGroupName) {
00270 assert(mgr);
00271 if (mgr->unlockGroupFn)
00272 return mgr->unlockGroupFn(mgr, groupName, subGroupName);
00273 else
00274 return GWEN_ERROR_NOT_IMPLEMENTED;
00275 }
00276
00277
00278
00279 int GWEN_ConfigMgr_DeleteGroup(GWEN_CONFIGMGR *mgr,
00280 const char *groupName,
00281 const char *subGroupName) {
00282 assert(mgr);
00283 if (mgr->deleteGroupFn)
00284 return mgr->deleteGroupFn(mgr, groupName, subGroupName);
00285 else
00286 return GWEN_ERROR_NOT_IMPLEMENTED;
00287 }
00288
00289
00290
00291 int GWEN_ConfigMgr_ListGroups(GWEN_CONFIGMGR *mgr,
00292 GWEN_STRINGLIST *sl) {
00293 assert(mgr);
00294 if (mgr->listGroupsFn)
00295 return mgr->listGroupsFn(mgr, sl);
00296 else
00297 return GWEN_ERROR_NOT_IMPLEMENTED;
00298 }
00299
00300
00301 int GWEN_ConfigMgr_ListSubGroups(GWEN_CONFIGMGR *mgr,
00302 const char *groupName,
00303 GWEN_STRINGLIST *sl) {
00304 assert(mgr);
00305 if (mgr->listSubGroupsFn)
00306 return mgr->listSubGroupsFn(mgr, groupName, sl);
00307 else
00308 return GWEN_ERROR_NOT_IMPLEMENTED;
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 GWEN_PLUGIN *GWEN_ConfigMgr_Plugin_new(GWEN_PLUGIN_MANAGER *pm,
00320 const char *name,
00321 const char *fileName) {
00322 GWEN_PLUGIN *pl;
00323 GWEN_CONFIGMGR_PLUGIN *xpl;
00324
00325 pl=GWEN_Plugin_new(pm, name, fileName);
00326 GWEN_NEW_OBJECT(GWEN_CONFIGMGR_PLUGIN, xpl);
00327 GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl, xpl,
00328 GWEN_ConfigMgr_Plugin_FreeData);
00329
00330 return pl;
00331 }
00332
00333
00334
00335 void GWENHYWFAR_CB GWEN_ConfigMgr_Plugin_FreeData(void *bp, void *p) {
00336 GWEN_CONFIGMGR_PLUGIN *xpl;
00337
00338 xpl=(GWEN_CONFIGMGR_PLUGIN*)p;
00339 GWEN_FREE_OBJECT(xpl);
00340 }
00341
00342
00343
00344 void GWEN_ConfigMgr_Plugin_SetFactoryFn(GWEN_PLUGIN *pl,
00345 GWEN_CONFIGMGR_PLUGIN_FACTORYFN f) {
00346 GWEN_CONFIGMGR_PLUGIN *xpl;
00347
00348 assert(pl);
00349 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
00350 assert(xpl);
00351
00352 xpl->factoryFn=f;
00353 }
00354
00355
00356
00357 GWEN_CONFIGMGR *GWEN_ConfigMgr_Plugin_Factory(GWEN_PLUGIN *pl,
00358 const char *url) {
00359 GWEN_CONFIGMGR_PLUGIN *xpl;
00360
00361 assert(pl);
00362 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
00363 assert(xpl);
00364
00365 assert(xpl->factoryFn);
00366 return xpl->factoryFn(pl, url);
00367 }
00368
00369
00370
00371 GWEN_CONFIGMGR *GWEN_ConfigMgr_Factory(const char *url) {
00372 GWEN_PLUGIN_MANAGER *pm;
00373 GWEN_PLUGIN *pl;
00374 GWEN_CONFIGMGR *mgr=NULL;
00375 GWEN_URL *purl;
00376 const char *modname;
00377
00378 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
00379 if (!pm) {
00380 DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"ConfigMgr\" found");
00381 return 0;
00382 }
00383
00384 purl=GWEN_Url_fromString(url);
00385 if (purl==NULL) {
00386 DBG_INFO(GWEN_LOGDOMAIN, "Invalid url [%s]", url);
00387 return NULL;
00388 }
00389
00390 modname=GWEN_Url_GetProtocol(purl);
00391 if (modname==NULL)
00392 modname="file";
00393
00394 pl=GWEN_PluginManager_GetPlugin(pm, modname);
00395 if (!pl) {
00396 DBG_INFO(GWEN_LOGDOMAIN, "ConfigMgr-Plugin \"%s\" not found", modname);
00397 GWEN_Url_free(purl);
00398 return 0;
00399 }
00400 GWEN_Url_free(purl);
00401
00402 mgr=GWEN_ConfigMgr_Plugin_Factory(pl, url);
00403 if (mgr==NULL) {
00404 DBG_INFO(GWEN_LOGDOMAIN,
00405 "Plugin did not create a GWEN_CONFIGMGR");
00406 }
00407
00408 return mgr;
00409 }
00410
00411
00412
00413
00414
00415
00416
00417
00418