SUBST: Dynamicaly generate contexts
[citadel.git] / webcit / sieve.c
index 4ed9fc5064589d3f4945eb2085a1b35a3b5099e9..214e7b4460759f252f02ed8be8e32fcfefd36ae7 100644 (file)
@@ -8,14 +8,20 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
+ *
+ * FIXME: add logic to exclude the webcit-generated script from the manual script selection
  */
 
 #include "webcit.h"
 
+CtxType CTX_SIEVELIST = CTX_NONE;
+CtxType CTX_SIEVESCRIPT = CTX_NONE;
+
 #define MAX_SCRIPTS    100
 #define MAX_RULES      50
 #define RULES_SCRIPT   "__WebCit_Generated_Script__"
 
+
 /*
  * Helper function for output_sieve_rule() to output strings with quotes escaped
  */
@@ -188,7 +194,6 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
                serv_printf("{");
        }
 
-
        /* Do action */
 
        if (!strcasecmp(action, "keep")) {
@@ -215,26 +220,22 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
                serv_printf("vacation :addresses [%s]\n\"%s\";", my_addresses, automsg);
        }
 
-
        /* Do 'final' action */
 
        if (!strcasecmp(final, "stop")) {
                serv_printf("stop;");
        }
 
-
        /* Close the braces if we're in a conditional loop */
 
        if (strcasecmp(hfield, "all")) {
                serv_printf("}");
        }
 
-
        /* End of rule. */
 }
 
 
-
 /*
  * Translate the fields from the rule editor into something we can save...
  */
@@ -351,7 +352,6 @@ void parse_fields_from_rule_editor(void) {
 }
 
 
-
 /*
  * save sieve config
  */
@@ -359,7 +359,6 @@ void save_sieve(void) {
        int bigaction;
        char script_names[MAX_SCRIPTS][64];
        int num_scripts = 0;
-       int active_script = (-1);       /* this throws a 'set but not used' warning , check this ! */
        int i;
        char this_name[64];
        char buf[256];
@@ -377,9 +376,6 @@ void save_sieve(void) {
        if (buf[0] == '1') while (serv_getln(buf, sizeof(buf)), strcmp(buf, "000")) {
                if (num_scripts < MAX_SCRIPTS) {
                        extract_token(script_names[num_scripts], buf, 0, '|', 64);
-                       if (extract_int(buf, 1) > 0) {
-                               active_script = num_scripts;
-                       }
                        ++num_scripts;
                }
        }
@@ -426,6 +422,15 @@ void save_sieve(void) {
        return;
 }
 
+
+void display_sieve_add_or_delete(void) {
+       output_headers(1, 1, 2, 0, 0, 0);
+       do_template("sieve_add");
+       wDumpContent(1);
+}
+
+
+
 /*
  * create a new script
  * take the web environment script name and create it on the citadel server
@@ -435,32 +440,25 @@ void create_script(void) {
 
        serv_printf("MSIV getscript|%s", bstr("script_name"));
        serv_getln(buf, sizeof buf);
-       if (buf[0] == '1') {
+       if (buf[0] == '1') {            // does script exist already?
                while (serv_getln(buf, sizeof(buf)), strcmp(buf, "000")) {
-                       /* flush */
+                                       // yes -- flush the output
                }
-               return;
        }
-       
-       serv_printf("MSIV putscript|%s", bstr("script_name"));
-       serv_getln(buf, sizeof buf);
-       if (buf[0] == '4') {
-               serv_puts("keep;");
-               serv_puts("000");
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
-               return;
+       else {
+                                       // no -- safe to create a new one by this name
+               serv_printf("MSIV putscript|%s", bstr("script_name"));
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       serv_puts("keep;");
+                       serv_puts("000");
+               }
        }
 
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
+       display_sieve_add_or_delete();
 }
 
 
-
-
 /*
  * delete a script
  */
@@ -469,11 +467,8 @@ void delete_script(void) {
 
        serv_printf("MSIV deletescript|%s", bstr("script_name"));
        serv_getln(buf, sizeof buf);
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
+       display_sieve_add_or_delete();
 }
-               
 
 
 /*
@@ -481,7 +476,7 @@ void delete_script(void) {
  */
 void display_no_sieve(void) {
 
-       output_headers(1, 1, 2, 0, 0, 0);
+       output_headers(1, 1, 1, 0, 0, 0);
        do_template("sieve_none");
        wDumpContent(1);
 }
@@ -496,22 +491,22 @@ typedef struct __SieveListing {
 
 int ConditionalSieveScriptIsActive(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        return SieveList->IsActive;
 }
 int ConditionalSieveScriptIsRulesScript(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        return SieveList->IsActive;
 }
 void tmplput_SieveScriptName(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        StrBufAppendTemplate(Target, TP, SieveList->Name, 0);
 }
 void tmplput_SieveScriptContent(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        StrBufAppendTemplate(Target, TP, SieveList->Content, 0);
 }
 void FreeSieveListing(void *vSieveListing)
@@ -575,8 +570,10 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
                                ++num_scripts;
                        }
        }
-       if ((num_scripts > 0) && (rules_script_active == 0))
+
+       if ((num_scripts > 0) && (rules_script_active == 0)) {
                PutBstr(HKEY("__SIEVE:EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1")));
+       }
 
        if (num_scripts > have_rules_script)
        {
@@ -595,19 +592,12 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
                       (vRuleset != NULL))
                {
                        Ruleset = (SieveListing *) vRuleset;
-
-                       /*
-                        * its the webcit rule? we don't need to load that here.
-                        */
-                       if (Ruleset->IsRulesScript)
-                               continue;
-
-                       if (!serv_printf("MSIV getscript|%s", ChrPtr(Ruleset->Name)))
-                               break;
+                       serv_printf("MSIV getscript|%s", ChrPtr(Ruleset->Name));
                        StrBuf_ServGetln(Line);
                        if (GetServerStatus(Line, NULL) == 1) 
                        {
                                Ruleset->Content = NewStrBuf();
+                               Done = 0;
                                while(!Done && (rc = StrBuf_ServGetln(Line), rc >= 0) )
                                        if ( (StrLength(Line)==3) && 
                                             !strcmp(ChrPtr(Line), "000")) 
@@ -696,7 +686,7 @@ typedef struct __SieveRule {
 
 int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        
         return GetTemplateTokenNumber(Target, 
                                       TP, 
@@ -707,7 +697,7 @@ int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -717,7 +707,7 @@ int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -727,7 +717,7 @@ int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -737,7 +727,7 @@ int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -747,7 +737,7 @@ int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -757,39 +747,39 @@ int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_Active(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return Rule->active;
 }
 void tmplput_SieveRule_htext(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->htext, 0);
 }
 void tmplput_SieveRule_fileinto(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->fileinto, 0);
 }
 void tmplput_SieveRule_redirect(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->redirect, 0);
 }
 void tmplput_SieveRule_automsg(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->automsg, 0);
 }
 void tmplput_SieveRule_sizeval(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendPrintf(Target, "%d", Rule->sizeval);
 }
 
 void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf *Target, WCTemplputParams *TP) 
 {
        void *vRoom;
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         wcsession *WCC = WC;
        HashList *Rooms = GetRoomListHashLKRA(Target, TP);
 
@@ -903,6 +893,8 @@ void
 InitModule_SIEVE
 (void)
 {
+       RegisterCTX(CTX_SIEVELIST);
+       RegisterCTX(CTX_SIEVESCRIPT);
        REGISTERTokenParamDefine(from);         
        REGISTERTokenParamDefine(tocc);         
        REGISTERTokenParamDefine(subject);      
@@ -969,4 +961,5 @@ InitModule_SIEVE
        WebcitAddUrlHandler(HKEY("save_sieve"), "", 0, save_sieve, 0);
        WebcitAddUrlHandler(HKEY("create_script"), "", 0, create_script, 0);
        WebcitAddUrlHandler(HKEY("delete_script"), "", 0, delete_script, 0);
+       WebcitAddUrlHandler(HKEY("display_sieve_add_or_delete"), "", 0, display_sieve_add_or_delete, 0);
 }