/*! 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; }