ROOMS: add foreach handler featuring netconfigs
authorWilfried Goesgens <dothebart@citadel.org>
Wed, 9 Jan 2013 23:06:59 +0000 (00:06 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Wed, 9 Jan 2013 23:06:59 +0000 (00:06 +0100)
citadel/include/ctdl_module.h
citadel/netconfig.c
citadel/room_ops.c

index 14671171d1c4d01026d37a15e848ca4f44aa7731..3525504a8eaec726f3f208094e850e029837ada4 100644 (file)
@@ -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;
index 984f97a2865e68aebe74f64df5b8e4e04d1eb03a..e6e0ea8a2efba772e90317c95e957de93f98a3bc 100644 (file)
@@ -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)
 {
index 15a6031e8ab4f30e20c3758e61a03d32298c95a2..23e5c9e03b59674f189d4a1f9ac153aa656b1a87 100644 (file)
@@ -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