// // aegis - project change supervisor // Copyright (C) 2005, 2006, 2008 Peter Miller // Copyright (C) 2007 Walter Franzini // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, see // . // #include #include #include #include #include #include #include #include #include #include input_svt_checkout::~input_svt_checkout() { } static input unzip_either(input &ifp) { input temp = input_gunzip_open(ifp); return input_bunzip2_open(temp); } input_svt_checkout::input_svt_checkout(const nstring &filename, const nstring &version) : src1_p(new input_file(filename)), src2_p(unzip_either(src1_p)), pos(0) { for (;;) { // // Read an RFC 822 header from the input. // rfc822 header; header.load(src2_p); // // If the version matches, extract it to a file. // long content_length = header.get_long("content-length"); src3_p = new input_crop(src2_p, content_length); unsigned long checksum = header.get_ulong("checksum"); src4_p = new input_verify_checksum(src3_p, checksum); if (version.empty() || version == header.get("version")) return; // // Throw away the file contents. // output::pointer bb = output_bit_bucket::create(); bb << src4_p; src4_p.close(); src3_p.close(); // // If there is no more input, we are done. // if (src2_p->at_end()) { sub_context_ty sc; sc.var_set_string("File_Name", filename); sc.var_set_string("Number", version); sc.fatal_intl(i18n("$filename: version $number not found")); // NOTREACHED } } } nstring input_svt_checkout::name() { return src1_p->name(); } long input_svt_checkout::length() { return (src4_p.is_open() ? src4_p->length() : 0); } long input_svt_checkout::ftell_inner() { return pos; } long input_svt_checkout::read_inner(void *data, size_t nbytes) { if (!src4_p.is_open()) return 0; long result = src4_p->read(data, nbytes); pos += result; return result; }