// // aegis - project change supervisor // Copyright (C) 2004-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 // for assert #include #include #include #include #include #include #include #include void server_run(server_ty *sp) { assert(sp); assert(sp->vptr); assert(sp->vptr->run); sp->vptr->run(sp); } void server_delete(server_ty *sp) { assert(sp); assert(sp->vptr); if (sp->vptr->destructor) sp->vptr->destructor(sp); sp->vptr = 0; sp->np = 0; mem_free(sp); } void server_response_queue(server_ty *sp, response *rp) { sp->np->response_queue(rp); } void server_response_flush(server_ty *sp) { sp->np->response_flush(); } bool server_getline(server_ty *sp, nstring &result) { return sp->np->getline(result); } void server_ok(server_ty *sp) { assert(sp); server_response_queue(sp, new response_ok()); } void server_error(server_ty *sp, const char *fmt, ...) { assert(sp); assert(fmt); va_list ap; va_start(ap, fmt); string_ty *msg = str_vformat(fmt, ap); va_end(ap); server_response_queue(sp, new response_error(msg)); } void server_e(server_ty *sp, const char *fmt, ...) { assert(sp); assert(fmt); va_list ap; va_start(ap, fmt); string_ty *msg = str_vformat(fmt, ap); va_end(ap); server_response_queue(sp, new response_e(msg)); } void server_m(server_ty *sp, const char *fmt, ...) { assert(sp); assert(fmt); va_list ap; va_start(ap, fmt); string_ty *msg = str_vformat(fmt, ap); va_end(ap); server_response_queue(sp, new response_m(msg)); } int server_root_required(server_ty *sp, const char *caption) { int root_required; assert(sp); assert(caption); root_required = !sp->np->get_is_rooted(); if (root_required) server_error(sp, "%s: must send Root request first", caption); return root_required; } int server_directory_required(server_ty *sp, const char *caption) { assert(sp); assert(caption); bool bad = !sp->np->curdir_is_set(); if (bad) server_error(sp, "%s: must send Directory request first", caption); return bad; } void server_argument(server_ty *sp, string_ty *arg) { assert(sp); assert(sp->np); sp->np->argument(arg); } void server_argumentx(server_ty *sp, string_ty *arg) { assert(sp); assert(sp->np); sp->np->argumentx(arg); } void server_accumulator_reset(server_ty *sp) { sp->np->accumulator_reset(); } file_info_ty * server_file_info_find(server_ty *sp, string_ty *server_side, int auto_alloc) { return sp->np->file_info_find(server_side, auto_alloc); } void server_updating_verbose(server_ty *sp, string_ty *client_side) { string_ty *dir = os_dirname_relative(client_side); if ( // this is a string, not a bool !sp->np->get_updating_verbose() || !str_equal(dir, sp->np->get_updating_verbose()) ) { server_e(sp, "Updating %s", dir->str_text); sp->np->set_updating_verbose(dir); } str_free(dir); } string_ty * server_directory_calc_client_side(server_ty *sp, string_ty *server_side) { const char *start; const char *end; const char *slash; start = server_side->str_text; end = start + server_side->str_length; slash = end; while (slash > start) { --slash; if (*slash == '/') { string_ty *ss; directory_ty *dp; ss = str_n_from_c(start, end - start); dp = sp->np->directory_find_server_side(ss); str_free(ss); if (dp) { string_ty *tmp; string_ty *cs; tmp = str_n_from_c(slash, end - slash); cs = str_catenate(dp->client_side, tmp); str_free(tmp); return cs; } } } return str_copy(server_side); }