// // aegis - project change supervisor // Copyright (C) 2002-2006, 2008 Peter Miller // // 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 input_catenate::~input_catenate() { trace(("input_catenate::~input_catenate()\n{\n")); pullback_transfer(deeper[selector]); delete [] deeper; deeper = 0; trace(("}\n")); } input_catenate::input_catenate(input arg1[], size_t arg2, bool arg3) : deeper(new input[arg2]), ndeeper(arg2), delete_on_close(arg3), selector(0), pos(0) { trace(("input_catenate(arg1 = %08lX, arg2 = %ld)\n{\n", (long)arg1, (long)arg2)); for (size_t j = 0; j < arg2; ++j) deeper[j] = arg1[j]; trace(("}\n")); } long input_catenate::read_inner(void *data, size_t len) { size_t nbytes = 0; trace(("input_catenate::read_inner()\n{\n")); for (;;) { assert(selector < ndeeper); input &fp = deeper[selector]; nbytes = fp->read(data, len); if (nbytes) break; if (selector + 1 >= ndeeper) break; selector++; } pos += nbytes; trace(("return %ld;\n", (long)nbytes)); trace(("}\n")); return nbytes; } long input_catenate::ftell_inner() { trace(("input_catenate::ftell_inner => %ld\n", (long)pos)); return pos; } nstring input_catenate::name() { trace(("input_catenate::name\n")); assert(selector < ndeeper); input &fp = deeper[selector]; return fp->name(); } long input_catenate::length() { long result = 0; for (size_t j = 0; j < ndeeper; ++j) { long len = deeper[j]->length(); if (len < 0) { result = -1; break; } result += len; } trace(("input_catenate::length => %ld\n", result)); return result; } void input_catenate::keepalive() { for (size_t j = 0; j < ndeeper; ++j) deeper[j]->keepalive(); } bool input_catenate::is_remote() const { trace(("input_catenate::is_remote\n")); assert(selector < ndeeper); input &fp = deeper[selector]; return fp->is_remote(); }