* 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
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)
{
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);
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)
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;
}
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)
<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>
-<option value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option>
+<??("COND:FLOOR:ISVIRTUAL", 1)><option value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option><??("X", 1)>
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,
*/
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? */
long len;
/* if we're a number: */
long lvalue;
+ eBitMask MaskBy;
} TemplateParam;