* defines may now be ored or anded
authorWilfried Göesgens <willi@citadel.org>
Sat, 14 Aug 2010 14:09:33 +0000 (14:09 +0000)
committerWilfried Göesgens <willi@citadel.org>
Sat, 14 Aug 2010 14:09:33 +0000 (14:09 +0000)
* conditionals should check, whether one of the above, ored: != 0, anded: == checkvalue
* added that to the QR* conditionals
* use the or/and notation in QR of room edit

webcit/roomlist.c
webcit/roomops.c
webcit/static/t/room/edit/tab_config.html
webcit/static/t/room/select_targetfloor.html
webcit/subst.c
webcit/subst.h

index 61a43c2e52465a26f099206605dcaf2e1169831f..dcffe0feaff153b63cf4c9c5a4f424011c7866a2 100644 (file)
@@ -719,6 +719,12 @@ int ConditionalFloorIsRESTSubFloor(StrBuf *Target, WCTemplputParams *TP)
        return WCC->CurrentFloor == MyFloor;
 }
 
+int ConditionalFloorIsVirtual(StrBuf *Target, WCTemplputParams *TP)
+{
+       Floor *MyFloor = (Floor *)CTX;
+
+       return MyFloor->ID == VIRTUAL_MY_FLOOR;
+}
 
 int ConditionalFloorIsSUBROOM(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -849,6 +855,7 @@ InitModule_ROOMLIST
        RegisterNamespace("FLOOR:NAME", 0, 1, tmplput_FLOOR_NAME, NULL, CTX_FLOORS);
        RegisterNamespace("FLOOR:NROOMS", 0, 0, tmplput_FLOOR_NROOMS, NULL, CTX_FLOORS);
        RegisterConditional(HKEY("COND:FLOOR:ISSUBROOM"), 0, ConditionalFloorIsSUBROOM, CTX_FLOORS);
+       RegisterConditional(HKEY("COND:FLOOR:ISVIRTUAL"), 0, ConditionalFloorIsVirtual, CTX_FLOORS);
        RegisterConditional(HKEY("COND:ROOM:REST:ISSUBFLOOR"), 0, ConditionalFloorIsRESTSubFloor, CTX_FLOORS);
 
        RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUFARR, CTX_NONE, IT_NOFLAG);
index 455de1d2ec3023a32d9761f8937fb08117b1402b..2a2b3472275803388d51e35cdd549ba875ddc532 100644 (file)
@@ -2979,9 +2979,15 @@ int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
        if (QR_CheckFlag == 0)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+       
+       if (WCC == NULL)
+               return 0;
 
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_CheckFlag) != 0));
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) == QR_CheckFlag;
 }
 
 int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
@@ -2993,7 +2999,12 @@ int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
        if (QR_CheckFlag == 0)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
-       return ((Folder->QRFlags & QR_CheckFlag) != 0);
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (Folder->QRFlags & QR_CheckFlag) != 0;
+       else
+               return (Folder->QRFlags & QR_CheckFlag) == QR_CheckFlag;
 }
 
 
@@ -3007,8 +3018,15 @@ int ConditionalCurrentRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
 
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0));
+       
+       if (WCC == NULL)
+               return 0;
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) == QR2_CheckFlag;
 }
 
 int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
index 7baaf925c2842c0f9a4a9eee15bc0e8e6960e09c..1435501175e6cad244b9e0d395393c5325e4aa9f 100644 (file)
@@ -4,7 +4,7 @@
                <ul>   
                        <li>
                                <?_("name of room: ")>
-                               <input type="text" name="er_name" value="<?ROOMNAME("U")>" maxlength="127" />
+                               <input type="text" name="er_name" value="<?ROOMNAME("X")>" maxlength="127" />
                        </li>
                        <li>
                                <?_("Resides on floor: ")>
                                        <li>
                                                <!-- this COND checks against the value of (QR_PRIVATE + QR_MAILBOX)) == 0 -->
                                                <input type="radio" name="type" value="public" 
-                                               <?%("COND:THISROOM:FLAG:QR", 3, "14688", 1, 'disabled="disabled" ', "")>
-                                               onChange="if (this.form.type[0].checked == true) { this.form.er_floor.disabled = false; }" />
+                                                      <?%("COND:THISROOM:FLAG:QR", 3, #"QR_PRIVATE | QR_MAILBOX", 1, 'disabled="disabled" ', "")>
+                                                      onChange="if (this.form.type[0].checked == true) { this.form.er_floor.disabled = false; }" />
                                                <?_("Public (automatically appears to everyone)")>
                                        </li>
                                        <li>
                                                <input type="radio" name="type" value="hidden" 
-                                                       <??("COND:THISROOM:FLAG:QR", 4, #"QR_PRIVATE")>
-                                                               <?%("COND:THISROOM:FLAG:QR", 5, #"QR_GUESSNAME", 1, 'checked="checked" ', "")> 
-                                                       <??("X", 4)>
-                                               onChange="if (this.form.type[1].checked == true) { this.form.er_floor.disabled = false; }" />
+                                                      <?%("COND:THISROOM:FLAG:QR", 5, #"QR_GUESSNAME & QR_PRIVATE", 1, 'checked="checked" ', "")> 
+                                                      onChange="if (this.form.type[1].checked == true) { this.form.er_floor.disabled = false; }" />
                                                <?_("Private - hidden (accessible to anyone who knows its name)")>
                                        </li>
                                        <li>
                                                <input type="radio" name="type" value="passworded" 
-                                                       <??("COND:THISROOM:FLAG:QR", 6, #"QR_PRIVATE")>
-                                                                       <?%("COND:THISROOM:FLAG:QR", 7, #"QR_PASSWORDED", 1, 'checked="checked" ', "")>
-                                                       <??("X", 6)>
-                                               onChange="this.form.er_floor.disabled = false; { (this.form.type[2].checked == true) }"
+                                                      <?%("COND:THISROOM:FLAG:QR", 7, #"QR_PASSWORDED & QR_PRIVATE", 1, 'checked="checked" ', "")>
+                                                      onChange="this.form.er_floor.disabled = false; { (this.form.type[2].checked == true) }"
                                                        />
                                                <?_("Private - require password: ")>
                                                <input type="text" name="er_password" value="<?THISROOM:PASS("U")>" maxlength="9" />
                                        </li>
                                        <li>
                                                <input type="radio" name="type" value="invonly" 
-                                                       <??("COND:THISROOM:FLAG:QR", 8, #"QR_PRIVATE")>
-                                                                <??("COND:THISROOM:FLAG:QR", 9, #"QR_GUESSNAME")>
-                                                                       <?%("COND:THISROOM:FLAG:QR", 10, #"QR_PASSWORDED", 1, 'checked="checked" ', "")>
-                                                               <??("X", 9)>
-                                                       <??("X", 8)>
-                                               onChange="if (this.form.type[3].checked == true) { this.form.er_floor.disabled = false; }" />
+                                                      <?%("COND:THISROOM:FLAG:QR", 10, #"QR_PASSWORDED & QR_PRIVATE & QR_GUESSNAME", 1, 'checked="checked" ', "")>
+                                                      onChange="if (this.form.type[3].checked == true) { this.form.er_floor.disabled = false; }" />
                                                <?_("Private - invitation only")>            
                                        </li>
                                        <li>
                                                <input type="radio" name="type" value="personal" 
-                                                       <?%("COND:THISROOM:FLAG:QR", 11, #"QR_MAILBOX", 1, 'checked="checked" ', "")>
-                                                       onChange="if (this.form.type[4].checked == true) { this.form.er_floor.disabled = true; }"
+                                                      <?%("COND:THISROOM:FLAG:QR", 11, #"QR_MAILBOX", 1, 'checked="checked" ', "")>
+                                                      onChange="if (this.form.type[4].checked == true) { this.form.er_floor.disabled = true; }"
                                                        />
                                                <?_("Personal (mailbox for you only)")>
                                        </li>
index 5fa5ba90950cd7179b8e4e7a22f25c7f9073049a..bf742d3da6d1e3b3785cb689f811cf40185d0449 100644 (file)
@@ -1 +1 @@
-<option value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option>
+<??("COND:FLOOR:ISVIRTUAL", 1)><option value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option><??("X", 1)>
index ec03f18c07ac0ae3bb39bfc25761c41b7ec1e46d..ee0e324e726bafe5cd84db4083d9f5ff5f72b6b1 100644 (file)
@@ -1303,8 +1303,81 @@ int GetNextParameter(StrBuf *Buf,
                
                        Parm->lvalue = *PVal;
                }
-               else 
+               else if (strchr(Parm->Start, '|') != NULL)
                {
+                       const char *Pos;
+                       StrBuf *pToken;
+                       StrBuf *Match;
+
+                       Parm->MaskBy = eOR;
+                       pToken = NewStrBufPlain (Parm->Start, Parm->len);
+                       Match = NewStrBufPlain (NULL, Parm->len);
+                       Pos = ChrPtr(pToken);
+                       
+                       while ((Pos != NULL) && (Pos != StrBufNOTNULL))
+                       {
+                               StrBufExtract_NextToken(Match, pToken, &Pos, '|');
+                               StrBufTrim(Match);
+                               if (StrLength (Match) > 0)
+                               {
+                                       if (GetHash(Defines, SKEY(Match), &vPVal) &&
+                                           (vPVal != NULL))
+                                       {
+                                               long *PVal;
+                                               PVal = (long*) vPVal;
+                                               
+                                               Parm->lvalue |= *PVal;
+                                       }
+                                       else {
+                                               LogTemplateError(NULL, "Define", 
+                                                                Tokens->nParameters,
+                                                                TP,
+                                                                "%s isn't known!!",
+                                                                ChrPtr(Match));
+
+                                       }
+                               }
+                       }
+               }
+               else if (strchr(Parm->Start, '&') != NULL)
+               {
+                       const char *Pos;
+                       StrBuf *pToken;
+                       StrBuf *Match;
+
+                       Parm->MaskBy = eAND;
+                       pToken = NewStrBufPlain (Parm->Start, Parm->len);
+                       Match = NewStrBufPlain (NULL, Parm->len);
+                       Pos = ChrPtr(pToken);
+                       
+                       while ((Pos != NULL) && (Pos != StrBufNOTNULL))
+                       {
+                               StrBufExtract_NextToken(Match, pToken, &Pos, '&');
+                               StrBufTrim(Match);
+                               if (StrLength (Match) > 0)
+                               {
+                                       if (GetHash(Defines, SKEY(Match), &vPVal) &&
+                                           (vPVal != NULL))
+                                       {
+                                               long *PVal;
+                                               PVal = (long*) vPVal;
+                                               
+                                               Parm->lvalue |= *PVal;
+                                       }
+                                       else {
+                                               LogTemplateError(NULL, "Define", 
+                                                                Tokens->nParameters,
+                                                                TP,
+                                                                "%s isn't known!!",
+                                                                ChrPtr(Match));
+
+                                       }
+                               }
+                       }
+               }
+               else {
+
+
                        LogTemplateError(NULL, "Define", 
                                         Tokens->nParameters,
                                         TP,
index 664da0ee1a592a990e58bec7552a1375de44e34c..adfaf8b380de4f31854793be71f53570f9cb9274 100644 (file)
@@ -92,6 +92,11 @@ typedef int (*WCPreevalFunc)(WCTemplateToken *Token);
  */
 typedef int (*WCConditionalFunc)(StrBuf *Target, WCTemplputParams *TP);
 
+typedef enum _eBitMask {
+       eNO = 0,
+       eOR,
+       eAND
+}eBitMask;
 
 typedef struct _TemplateParam {
         /* are we a string or a number? */
@@ -101,6 +106,7 @@ typedef struct _TemplateParam {
        long len;
        /* if we're a number: */
        long lvalue;
+       eBitMask MaskBy;
 } TemplateParam;