// // 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 // . // #ifndef AE_CVS_SERVER_NET_H #define AE_CVS_SERVER_NET_H #include #include #include #include #include enum response_code_ty { response_code_Checked_in, response_code_Checksum, response_code_Clear_static_directory, response_code_Clear_sticky, response_code_Copy_file, response_code_Created, response_code_E, response_code_error, response_code_F, response_code_hate, response_code_love, response_code_M, response_code_Mbinary, response_code_Merged, response_code_Mode, response_code_Mod_time, response_code_Module_expansion, response_code_MT, response_code_New_entry, response_code_Notified, response_code_ok, response_code_Patched, response_code_Rcs_diff, response_code_Removed, response_code_Remove_entry, response_code_Set_checkin_prog, response_code_Set_static_directory, response_code_Set_sticky, response_code_Set_update_prog, response_code_Template, response_code_Updated, response_code_Update_existing, response_code_Valid_requests, response_code_Wrapper_rcsOption, response_code_MAX // must be last }; class output_ty; // forward class response; // forward /** * The net_ty class is used to remember the state of a network connection * to a client. */ class net_ty { public: /** * The destructor. */ virtual ~net_ty(); /** * The default constructor. */ net_ty(); /** * The getline method is used to read one line from the input (up * to the next newline character or end of input). The newline * is not included in the returned string. Returns false if * end-of-file is reached. */ bool getline(nstring &s); /** * The printf method is used to write output to the client. */ void printf(const char *, ...) ATTR_PRINTF(2, 3); /** * The response_queue method is used to enqueue a response to be * transmitted at the next response_flush. */ void response_queue(response *rp); /** * The response_flush method is used to flush any pending responses * (if any) to the client. */ void response_flush(void); /** * The log_to_file method is used to enable logging of all requests * and responses. This is for debugging. */ void log_to_file(string_ty *); /** * The log_by_env method is used to enable logging if the given * environment variable has been set. The value of the environment * variable is the name of the log file to use. */ void log_by_env(const char *); /** * The argument method is used to append the given string to the * argument list. */ void argument(string_ty *); /** * The argumentx method is used to append the given string to the * end of the last string on the argument list. */ void argumentx(string_ty *); /** * The accumulator_reset method is used to discard the most * recently accumulated lists of directories, entries and arguments. */ void accumulator_reset(void); /** * The file_info_find method is used to locate the file info * structure for a particular root-relative file name. * * @param server_side * The server-side name of the file, including the module name, * but excluding ROOT_PATH/ * @param auto_alloc * True if the name should be allocated if not foind, false if it * should not. * @returns * The corresponding file_info_ty data structure. Returns NULL if * auto_alloc was false, and the necessary data was not found. */ struct file_info_ty *file_info_find(string_ty *server_side, int auto_alloc); /** * The directory_set method may be used to set the directory, * as given in in a Directory request. */ void directory_set(string_ty *cs, string_ty *ss); /** * The directory_find_client_side method is used to search the * existing Directory names, looking for the given client-side directory. * Returns NULL if not found. Do not free the result. */ directory_ty *directory_find_client_side(string_ty *); /** * The directory_find_server_side method is used to search the * existing Directory names, looking for the given server-side directory. * Returns NULL if not found. Do not free the result. */ directory_ty *directory_find_server_side(string_ty *); /** * The get_is_rooted method is used to find out if we have seet a * Root request yet. */ bool get_is_rooted() const { return rooted; } /** * The set_is_rooted method is used by the Root request to indicate * that a valid Root request has been processed. */ void set_is_rooted() { rooted = true; } /** * The set_respose_valid method is used the the Valid-Response * request to indicate those responses which are valid for this * client. */ void set_response_valid(int n) { response_valid[n] = true; } /** * The get_updating_verbose method is used to obtain the last * client-side directory we claimed to be updating. */ string_ty *get_updating_verbose() const { return updating_verbose; } /** * The get_updating_verbose method is used to set the * client-side directory we are currently updating. */ void set_updating_verbose(string_ty *); /** * The in_crop method is used to create a new input source which * reads the next \a length bytes. * * @param length * The number of bytes to be consumed. * @returns * an input stream, use it in the usual way. */ input in_crop(long length); directory_ty *get_curdir() const { return curdir; } bool curdir_is_set() const { return (curdir != 0); } size_t argument_count() const { return argument_list.size(); } string_ty *argument_nth(size_t n) const { return argument_list[n]; } private: input in; output::pointer out; output::pointer log_client; /** * The rooted instance variable is used to remeber whether we have * seet a Root request yet, or not. */ bool rooted; /** * The set of responses which are currently valid. */ bool response_valid[response_code_MAX]; // // The response queue, the list of responses yet to be sent to // the client. // size_t response_queue_length; size_t response_queue_max; response **response_queue_item; // // The set of directories accumulated by Directory requests until // something eats them all, indexed by client-side path. // struct symtab_ty *dir_info_cs; // // The set of directories accumulated by Directory requests until // something eats them all, indexed by server-side path. // struct symtab_ty *dir_info_ss; // // The most recent Directory request. // directory_ty *curdir; // // The file_info field is used to remember a table of information // about files, indexed by root-relative file name. // struct symtab_ty *file_info; // // The list of strings accumulated by Argument and Argumentx requests // until something eats them all. // string_list_ty argument_list; /** * The updating_verbose instance variable is used to remember the * last client-side directory we claimed to be updating. */ string_ty *updating_verbose; private: /** * The copy constructor. Do not use. */ net_ty(const net_ty &); /** * The assignment operator. Do not use. */ net_ty &operator=(const net_ty &); }; #endif // AE_CVS_SERVER_NET_H