I know you don't need *FunctionTable.pm, but hey, it's free.

--- ../modperl-2.0/src/modules/perl/modperl_filter.h    Tue May 22 11:07:28 2001
+++ src/modules/perl/modperl_filter.h   Tue May 29 14:16:26 2001
@@ -42,6 +42,15 @@
                                                  SV *buffer,
                                                  apr_ssize_t wanted);
 
+MP_INLINE int modperl_output_filter_eof(pTHX_
+                                        modperl_filter_t *filter);
+
+MP_INLINE int modperl_output_filter_tell(pTHX_
+                                         modperl_filter_t *filter);
+
+MP_INLINE int modperl_output_filter_close(pTHX_
+                                          modperl_filter_t *filter);
+
 MP_INLINE apr_status_t modperl_output_filter_write(modperl_filter_t *filter,
                                                    const char *buf,
                                                    apr_ssize_t *len);
--- ../modperl-2.0/src/modules/perl/modperl_types.h     Thu May 10 14:48:17 2001
+++ src/modules/perl/modperl_types.h    Tue May 29 14:27:02 2001
@@ -179,7 +179,9 @@
 } modperl_filter_mode_e;
 
 typedef struct {
-    int eos;
+    uint eos:1;           /* EOS found */
+    uint eof:1;           /* No more data to send to Perl code */
+    apr_ssize_t read_cnt; /* bytes actually read */
     ap_filter_t *f;
     char *leftover;
     apr_ssize_t remaining;
--- ../modperl-2.0/xs/Apache/Filter/Apache__Filter.h    Tue May 22 11:05:24 2001
+++ xs/Apache/Filter/Apache__Filter.h   Tue May 29 13:53:56 2001
@@ -32,6 +32,33 @@
     return bytes;
 }
 
+
+static MP_INLINE int mpxs_Apache__Filter_eof(pTHX_ I32 items,
+                                             SV **MARK, SV **SP)
+{
+    modperl_filter_t *modperl_filter;
+    mpxs_usage_va_1(modperl_filter, "$filter->eof()");
+    return modperl_output_filter_eof(aTHX_ modperl_filter);
+}
+
+
+static MP_INLINE int mpxs_Apache__Filter_tell(pTHX_ I32 items,
+                                              SV **MARK, SV **SP)
+{
+    modperl_filter_t *modperl_filter;
+    mpxs_usage_va_1(modperl_filter, "$filter->tell()");
+    return modperl_output_filter_tell(aTHX_ modperl_filter);
+}
+
+static MP_INLINE int mpxs_Apache__Filter_close(pTHX_ I32 items,
+                                             SV **MARK, SV **SP)
+{
+    modperl_filter_t *modperl_filter;
+    mpxs_usage_va_1(modperl_filter, "$filter->close()");
+    return modperl_output_filter_send_EOS(modperl_filter);
+}
+
+
 static MP_INLINE apr_size_t mpxs_Apache__Filter_read(pTHX_ I32 items,
                                                      SV **MARK, SV **SP)
 {
--- ../modperl-2.0/t/filter/TestFilter/api.pm   Thu Apr 19 21:57:26 2001
+++ t/filter/TestFilter/api.pm  Tue May 29 14:01:17 2001
@@ -23,15 +23,35 @@
 sub handler {
     my $filter = shift;
 
-    $filter->read(my $buffer); #slurp everything;
-
     init_test_pm($filter);
 
-    plan tests => 6;
+    plan tests => 14;
+
+    ok $filter->isa('Apache::Filter');
+
+    ok !$filter->eof;
+
+    ok !$filter->tell;
+
+    my $s = $filter->read(my $buffer); #slurp everything;
+
+    ok $s == length $response_data;
 
     ok $buffer eq $response_data;
 
-    ok $filter->isa('Apache::Filter');
+    ok $filter->tell == length $response_data;
+
+    ok !$filter->eof;
+
+    $s = $filter->read($buffer); #try to slurp a bit more
+
+    ok $filter->tell == length $response_data;
+
+    ok !$s;
+
+    ok !$filter->close ;
+
+    #ok $filter->eof; Hmmm, no EOS => no eof. Rats.
 
     my $frec = $filter->frec;
 
--- ../modperl-2.0/src/modules/perl/modperl_filter.c    Thu May 24 10:55:51 2001
+++ src/modules/perl/modperl_filter.c   Tue May 29 14:20:06 2001
@@ -223,6 +223,7 @@
             sv_catpvn(buffer, filter->leftover, wanted);
             filter->leftover += wanted;
             filter->remaining -= wanted;
+            filter->read_cnt += wanted;
             return wanted;
         }
         else {
@@ -237,6 +238,9 @@
 
     if (!filter->bb) {
         MP_TRACE_f(MP_FUNC, "bucket brigade has been emptied\n");
+        if (filter->eos) {
+            filter->eof=1;
+        }
         return 0;
     }
 
@@ -269,6 +273,7 @@
             MP_TRACE_f(MP_FUNC,
                        "apr_bucket_read error: %s\n",
                        modperl_apr_strerror(filter->rc));
+            filter->read_cnt += len;
             return len;
         }
 
@@ -298,8 +303,27 @@
     }
 #endif
 
+    if (!len && filter->eos && !filter->remaining) {
+        filter->eof=1;
+    }
+
+    filter->read_cnt += len;
     return len;
 }
+
+MP_INLINE apr_ssize_t modperl_output_filter_eof(pTHX_
+                                                modperl_filter_t *filter)
+{
+    return filter->eof;
+}
+
+
+MP_INLINE apr_ssize_t modperl_output_filter_tell(pTHX_
+                                                 modperl_filter_t *filter)
+{
+    return filter->read_cnt;
+}
+
 
 MP_INLINE apr_status_t modperl_output_filter_flush(modperl_filter_t *filter)
 {
--- ../modperl-2.0/xs/maps/modperl_functions.map        Thu May 10 14:51:49 2001
+++ xs/maps/modperl_functions.map       Tue May 29 13:54:30 2001
@@ -36,6 +36,9 @@
 
  mpxs_Apache__Filter_print | | ...
  mpxs_Apache__Filter_read  | | ...
+ mpxs_Apache__Filter_eof   | | ...
+ mpxs_Apache__Filter_tell  | | ...
+ mpxs_Apache__Filter_close | | ...
 
  SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=Nullsv
  int:DEFINE_PRINT      | | ...
--- ../modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm   Thu May 10 14:52:08 
2001
+++ xs/tables/current/ModPerl/FunctionTable.pm  Tue May 29 14:28:19 2001
@@ -2059,6 +2059,48 @@
     'name' => 'modperl_output_filter_read'
   },
   {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'filter',
+        'type' => 'modperl_filter_t *'
+      },
+    ],
+    'name' => 'modperl_output_filter_eof'
+  },
+  {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'filter',
+        'type' => 'modperl_filter_t *'
+      },
+    ],
+    'name' => 'modperl_output_filter_tell'
+  },
+  {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'filter',
+        'type' => 'modperl_filter_t *'
+      },
+    ],
+    'name' => 'modperl_output_filter_close'
+  },
+  {
     'return_type' => 'apr_status_t',
     'args' => [
       {
@@ -3644,6 +3686,72 @@
       }
     ],
     'name' => 'mpxs_Apache__Filter_read'
+  },
+  {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'items',
+        'type' => 'I32'
+      },
+      {
+        'name' => 'mark',
+        'type' => 'SV **'
+      },
+      {
+        'name' => 'sp',
+        'type' => 'SV **'
+      }
+    ],
+    'name' => 'mpxs_Apache__Filter_eof'
+  },
+  {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'items',
+        'type' => 'I32'
+      },
+      {
+        'name' => 'mark',
+        'type' => 'SV **'
+      },
+      {
+        'name' => 'sp',
+        'type' => 'SV **'
+      }
+    ],
+    'name' => 'mpxs_Apache__Filter_tell'
+  },
+  {
+    'return_type' => 'int',
+    'args' => [
+      {
+        'name' => 'my_perl',
+        'type' => 'PerlInterpreter *'
+      },
+      {
+        'name' => 'items',
+        'type' => 'I32'
+      },
+      {
+        'name' => 'mark',
+        'type' => 'SV **'
+      },
+      {
+        'name' => 'sp',
+        'type' => 'SV **'
+      }
+    ],
+    'name' => 'mpxs_Apache__Filter_close'
   },
   {
     'return_type' => 'U32 *',

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to