* gpgsm.c (main): Don't print the "go ahead" message for an
[gnupg.git] / assuan / assuan-client.c
index 03c7c09..6c7a6e3 100644 (file)
@@ -32,8 +32,8 @@
 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
 
 
 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
 
 
-static AssuanError
-read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
+AssuanError
+_assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
 {
   char *line;
   int linelen;
 {
   char *line;
   int linelen;
@@ -57,12 +57,23 @@ read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
       *okay = 2; /* data line */
       *off = 2;
     }
       *okay = 2; /* data line */
       *off = 2;
     }
+  else if (linelen >= 1
+           && line[0] == 'S' 
+           && (line[1] == '\0' || line[1] == ' '))
+    {
+      *okay = 4;
+      *off = 1;
+      while (line[*off] == ' ')
+        ++*off;
+    }  
   else if (linelen >= 2
            && line[0] == 'O' && line[1] == 'K'
            && (line[2] == '\0' || line[2] == ' '))
     {
       *okay = 1;
       *off = 2;
   else if (linelen >= 2
            && line[0] == 'O' && line[1] == 'K'
            && (line[2] == '\0' || line[2] == ' '))
     {
       *okay = 1;
       *off = 2;
+      while (line[*off] == ' ')
+        ++*off;
     }
   else if (linelen >= 3
            && line[0] == 'E' && line[1] == 'R' && line[2] == 'R'
     }
   else if (linelen >= 3
            && line[0] == 'E' && line[1] == 'R' && line[2] == 'R'
@@ -70,6 +81,8 @@ read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
     {
       *okay = 0;
       *off = 3;
     {
       *okay = 0;
       *off = 3;
+      while (line[*off] == ' ')
+        ++*off;
     }  
   else if (linelen >= 7
            && line[0] == 'I' && line[1] == 'N' && line[2] == 'Q'
     }  
   else if (linelen >= 7
            && line[0] == 'I' && line[1] == 'N' && line[2] == 'Q'
@@ -79,6 +92,15 @@ read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
     {
       *okay = 3;
       *off = 7;
     {
       *okay = 3;
       *off = 7;
+      while (line[*off] == ' ')
+        ++*off;
+    }
+  else if (linelen >= 3
+           && line[0] == 'E' && line[1] == 'N' && line[2] == 'D'
+           && (line[3] == '\0' || line[3] == ' '))
+    {
+      *okay = 5; /* end line */
+      *off = 3;
     }
   else
     rc = ASSUAN_Invalid_Response;
     }
   else
     rc = ASSUAN_Invalid_Response;
@@ -95,6 +117,8 @@ read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
  * @data_cb_arg: first argument passed to @data_cb
  * @inquire_cb: Callback function for a inquire response
  * @inquire_cb_arg: first argument passed to @inquire_cb
  * @data_cb_arg: first argument passed to @data_cb
  * @inquire_cb: Callback function for a inquire response
  * @inquire_cb_arg: first argument passed to @inquire_cb
+ * @status_cb: Callback function for a status response
+ * @status_cb_arg: first argument passed to @status_cb
  * 
  * FIXME: Write documentation
  * 
  * 
  * FIXME: Write documentation
  * 
@@ -108,18 +132,20 @@ assuan_transact (ASSUAN_CONTEXT ctx,
                  AssuanError (*data_cb)(void *, const void *, size_t),
                  void *data_cb_arg,
                  AssuanError (*inquire_cb)(void*, const char *),
                  AssuanError (*data_cb)(void *, const void *, size_t),
                  void *data_cb_arg,
                  AssuanError (*inquire_cb)(void*, const char *),
-                 void *inquire_cb_arg)
+                 void *inquire_cb_arg,
+                 AssuanError (*status_cb)(void*, const char *),
+                 void *status_cb_arg)
 {
   int rc, okay, off;
   unsigned char *line;
   int linelen;
 
 {
   int rc, okay, off;
   unsigned char *line;
   int linelen;
 
-  rc = _assuan_write_line (ctx, command);
+  rc = assuan_write_line (ctx, command);
   if (rc)
     return rc;
 
  again:
   if (rc)
     return rc;
 
  again:
-  rc = read_from_server (ctx, &okay, &off);
+  rc = _assuan_read_from_server (ctx, &okay, &off);
   if (rc)
     return rc; /* error reading from server */
 
   if (rc)
     return rc; /* error reading from server */
 
@@ -162,8 +188,8 @@ assuan_transact (ASSUAN_CONTEXT ctx,
     {
       if (!inquire_cb)
         {
     {
       if (!inquire_cb)
         {
-          _assuan_write_line (ctx, "END"); /* get out of inquire mode */
-          read_from_server (ctx, &okay, &off); /* dummy read the response */
+          assuan_write_line (ctx, "END"); /* get out of inquire mode */
+          _assuan_read_from_server (ctx, &okay, &off); /* dummy read */
           rc = ASSUAN_No_Inquire_Callback;
         }
       else
           rc = ASSUAN_No_Inquire_Callback;
         }
       else
@@ -175,6 +201,25 @@ assuan_transact (ASSUAN_CONTEXT ctx,
             goto again;
         }
     }
             goto again;
         }
     }
+  else if (okay == 4)
+    {
+      if (status_cb)
+        rc = status_cb (status_cb_arg, line);
+      if (!rc)
+        goto again;
+    }
+  else if (okay == 5)
+    {
+      if (!data_cb)
+        rc = ASSUAN_No_Data_Callback;
+      else 
+        {
+          rc = data_cb (data_cb_arg, NULL, 0);
+          if (!rc)
+            goto again;
+        }
+    }
 
   return rc;
 }
 
   return rc;
 }
+