Hi,

here are some unrelated issues about cdebconf.

1. The helper macros recently introduced do break several packages
under debian-installer/tools/ which used to declare their own
debconf_input function.  Maybe we could remove these macros, I
wonder whether they are that useful.

2. The attached backup.patch finishes support for backing up.  As it
slightly changes cdebconf interface, I prefer sending it there.

3. May I set a _ macro in frontend.h in order to start i18n of
frontends?  As libdiscover already calls dcgettext, I would like to
set it to
   #define _(x) dcgettext("cdebconf", (x), LC_MESSAGES)

4. As esplained in #172218, current TITLE command is not l10n-friendly.
I will wait for Joey's solution before changing this in cdebconf, but
the new progress bar support suffers from the same problem.

Denis
Index: src/commands.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/cdebconf/src/commands.c,v
retrieving revision 1.37
diff -u -r1.37 commands.c
--- src/commands.c      8 Dec 2002 00:38:07 -0000       1.37
+++ src/commands.c      10 Dec 2002 23:18:36 -0000
@@ -163,18 +163,17 @@
 int command_go(struct confmodule *mod, int argc, char **argv, 
        char *out, size_t outsize)
 {
-       struct question *q;
-
        CHECKARGC(== 0);
        if (mod->frontend->methods.go(mod->frontend) == CMDSTATUS_GOBACK)
+       {
                snprintf(out, outsize, "%u backup", CMDSTATUS_GOBACK);
-    else 
-    {
-        snprintf(out, outsize, "%u ok", CMDSTATUS_SUCCESS);
-        /* FIXME  questions should be tagged when closing session */
-        for (q = mod->frontend->questions; q != NULL; q = q->next)
-            q->flags |= DC_QFLAG_SEEN;
-    }
+               mod->update_seen_questions(mod, -1);
+       }
+       else
+       {
+               snprintf(out, outsize, "%u ok", CMDSTATUS_SUCCESS);
+               mod->update_seen_questions(mod, 1);
+       }
        mod->frontend->methods.clear(mod->frontend);
 
        return DC_OK;
Index: src/confmodule.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/cdebconf/src/confmodule.c,v
retrieving revision 1.17
diff -u -r1.17 confmodule.c
--- src/confmodule.c    8 Dec 2002 00:38:07 -0000       1.17
+++ src/confmodule.c    10 Dec 2002 23:18:36 -0000
@@ -1,6 +1,8 @@
 #include "confmodule.h"
 #include "commands.h"
 #include "frontend.h"
+#include "database.h"
+#include "question.h"
 #include "strutl.h"
 
 #include <stdio.h>
@@ -170,6 +172,72 @@
        return pid;
 }
 
+static int confmodule_update_seen_questions(struct confmodule *mod, int action)
+{
+       struct question *q;
+       struct question *qlast = NULL;
+       int i, narg;
+
+       switch (action)
+       {
+       case 1:
+               if (mod->seen_questions == NULL)
+                       narg = 0;
+               else
+                       narg = sizeof(mod->seen_questions) / sizeof(char *);
+
+               i = narg;
+               for (q = mod->frontend->questions; q != NULL; q = q->next)
+                       narg++;
+               if (narg == 0)
+                       return DC_OK;
+
+               mod->seen_questions = (char **) realloc(mod->seen_questions, narg);
+               for (q = mod->frontend->questions; q != NULL; q = q->next)
+               {
+                       *(mod->seen_questions+i) = strdup(q->tag);
+                       i++;
+               }
+               break;
+       case -1:
+               if (mod->seen_questions == NULL)
+                       return DC_OK;
+
+               narg = sizeof(mod->seen_questions) / sizeof(char *);
+               for (q = mod->frontend->questions; q != NULL; q = q->next)
+                       qlast = q;
+
+               for (q = qlast; q != NULL; q = q->prev)
+               {
+                       if (strcmp(*(mod->seen_questions + narg - 1), q->tag) != 0)
+                               return DC_OK;
+                       DELETE(*(mod->seen_questions + narg - 1));
+                       narg --;
+               }
+               break;
+       case 0:
+               if (mod->seen_questions == NULL)
+                       return DC_OK;
+
+               narg = sizeof(mod->seen_questions) / sizeof(char *);
+               for (i = 0; i < narg; i++)
+               {
+                       q = mod->questions->methods.get(mod->questions, 
+*(mod->seen_questions+i));
+                       if (q == NULL)
+                               return DC_NOTOK;
+                       q->flags |= DC_QFLAG_SEEN;
+                       DELETE(*(mod->seen_questions+i));
+               }
+               DELETE(mod->seen_questions);
+               break;
+       default:
+               /* should never happen */
+               DIE("Mismatch argument in confmodule_update_seen_questions");
+       }
+
+       return DC_OK;
+}
+
 struct confmodule *confmodule_new(struct configuration *config,
        struct template_db *templates, struct question_db *questions, 
     struct frontend *frontend)
@@ -183,6 +251,7 @@
        mod->run = confmodule_run;
        mod->communicate = confmodule_communicate;
        mod->shutdown = confmodule_shutdown;
+       mod->update_seen_questions = confmodule_update_seen_questions;
 
        /* TODO: I wish we don't need gross hacks like this.... */
        setenv("DEBIAN_HAS_FRONTEND", "1", 1);
@@ -194,3 +263,4 @@
 {
        DELETE(mod);
 }
+
Index: src/confmodule.h
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/cdebconf/src/confmodule.h,v
retrieving revision 1.4
diff -u -r1.4 confmodule.h
--- src/confmodule.h    7 Dec 2002 23:02:40 -0000       1.4
+++ src/confmodule.h    10 Dec 2002 23:18:36 -0000
@@ -17,12 +17,13 @@
 struct confmodule {
        struct configuration *config;
        struct template_db *templates;
-    struct question_db *questions;
+       struct question_db *questions;
        struct frontend *frontend;
        pid_t pid;
        int infd, outfd;
        int exitcode;
        char *owner;
+       char **seen_questions;
 
        /* methods */
     /*
@@ -48,6 +49,14 @@
      * @return int - exit code of the config script
      */
        int (*shutdown)(struct confmodule *mod);
+
+    /**
+     * @brief Stack for already seen questions, to help backing up
+     * @param struct confmodule *mod - confmodule object
+     * @param int action - push, pop or sync values
+     * @return int - DC_OK, DC_NOTOK
+     */
+       int (*update_seen_questions)(struct confmodule *mod, int action);
 };
 
 /**
Index: src/debconf.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/cdebconf/src/debconf.c,v
retrieving revision 1.15
diff -u -r1.15 debconf.c
--- src/debconf.c       7 Dec 2002 23:02:40 -0000       1.15
+++ src/debconf.c       10 Dec 2002 23:18:37 -0000
@@ -28,6 +28,8 @@
 
 static void save()
 {
+       if (confmodule != NULL)
+               confmodule->update_seen_questions(confmodule, 0);
        if (questions != NULL)
                questions->methods.save(questions);
        if (templates != NULL)

Reply via email to