예제 #1
0
/*!
  Flush remaining data.
  Additional footer data for filters is added at the end.
  Returns 0 on success.
*/
int FiltersChain::flush (size_t *nbw)
{
  u_long written = 0;
  char buffer[512];
  list<Filter*>::iterator i;
  *nbw = 0;
  if (firstFilter != NULL)
    {
      if (firstFilter->flush (nbw))
        return 1;
    }
  else if (stream)
    {
      if (stream->flush (nbw))
        return 1;
    }
  written = *nbw;

  ;
  /* Position on the last element.  */
  i = filters.end ();

  while (i != filters.begin ())
    {
      Filter* f;
      size_t tmpNbw = 0;

      --i;
      f = *i;

      if (f->getFooter (buffer, 512, &tmpNbw))
        return -1;
      f->getParent ()->write (buffer, tmpNbw, nbw);
      written += (*nbw);
    }

  /* Set the final value.  */
  *nbw = written;
  return 0;
}