From 1e6f5260bcc5c5a8f2d6ec5e0d164b84ac1ad893 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 10 Jan 2013 00:06:59 +0100 Subject: [PATCH] ROOMS: add foreach handler featuring netconfigs --- citadel/include/ctdl_module.h | 13 +++++++++---- citadel/netconfig.c | 7 +++++++ citadel/room_ops.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/citadel/include/ctdl_module.h b/citadel/include/ctdl_module.h index 14671171d..3525504a8 100644 --- a/citadel/include/ctdl_module.h +++ b/citadel/include/ctdl_module.h @@ -226,6 +226,9 @@ long CtdlGetCurrentMessageNumber(void); /* * Expose various room operation functions from room_ops.c to the modules API */ +typedef struct CfgLineType CfgLineType; +typedef struct RoomNetCfgLine RoomNetCfgLine; +typedef struct OneRoomNetCfg OneRoomNetCfg; unsigned CtdlCreateRoom(char *new_room_name, int new_room_type, @@ -242,6 +245,11 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, void CtdlPutRoomLock(struct ctdlroom *qrbuf); typedef void (*ForEachRoomCallBack)(struct ctdlroom *EachRoom, void *out_data); void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data); +typedef void (*ForEachRoomNetCfgCallBack)(struct ctdlroom *EachRoom, void *out_data, const OneRoomNetCfg *OneRNCFG); +void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, + void *in_data, + RoomNetCfg filter); + void CtdlDeleteRoom(struct ctdlroom *qrbuf); int CtdlRenameRoom(char *old_name, char *new_name, int new_floor); void CtdlUserGoto (char *where, int display_result, int transiently, @@ -378,10 +386,6 @@ struct config { extern struct config config; -typedef struct CfgLineType CfgLineType; -typedef struct RoomNetCfgLine RoomNetCfgLine; -typedef struct OneRoomNetCfg OneRoomNetCfg; - typedef void (*CfgLineParser)(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *rncfg); typedef void (*CfgLineSerializer)(const CfgLineType *ThisOne, StrBuf *OuptputBuffer, OneRoomNetCfg *rncfg, RoomNetCfgLine *data); typedef void (*CfgLineDeAllocator)(const CfgLineType *ThisOne, RoomNetCfgLine **data); @@ -417,6 +421,7 @@ void ParseGeneric(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, void SerializeGeneric(const CfgLineType *ThisOne, StrBuf *OutputBuffer, OneRoomNetCfg *sc, RoomNetCfgLine *data); void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data); +const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber); typedef struct _nodeconf { int DeleteMe; diff --git a/citadel/netconfig.c b/citadel/netconfig.c index 984f97a28..e6e0ea8a2 100644 --- a/citadel/netconfig.c +++ b/citadel/netconfig.c @@ -307,6 +307,13 @@ void FreeRoomNetworkStruct(OneRoomNetCfg **pOneRNCFG) *pOneRNCFG=NULL; } +const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber) +{ + void *pv; + GetHash(RoomConfigs, LKEY(QRNumber), &pv); + return (OneRoomNetCfg*)pv; +} + void LoadAllNetConfigs(void) { diff --git a/citadel/room_ops.c b/citadel/room_ops.c index 15a6031e8..23e5c9e03 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -586,6 +586,40 @@ void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data) } } +/* + * Traverse the room file... + */ +void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, + void *in_data, + RoomNetCfg filter) +{ + struct ctdlroom qrbuf; + struct cdbdata *cdbqr; + + cdb_rewind(CDB_ROOMS); + + while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) { + memset(&qrbuf, 0, sizeof(struct ctdlroom)); + memcpy(&qrbuf, cdbqr->ptr, + ((cdbqr->len > sizeof(struct ctdlroom)) ? + sizeof(struct ctdlroom) : cdbqr->len) + ); + cdb_free(cdbqr); + room_sanity_check(&qrbuf); + if (qrbuf.QRflags & QR_INUSE) + { + const OneRoomNetCfg* RNCfg; + RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber); + if ((RNCfg != NULL) && + ((filter == maxRoomNetCfg) || + (RNCfg->NetConfigs[filter] != NULL))) + { + CB(&qrbuf, in_data, RNCfg); + } + } + } +} + /* * delete_msglist() - delete room message pointers -- 2.30.2