/* Do not remove the headers from this file! see /USAGE for more info. */ /* ** ed_session.c ** ** Represents an editing session. This is used in conjunction with the ** input system to allow nested editing/more/help/etc. ** ** 23-Jan-95. Deathblade. Created. */ #include <mudlib.h> #include <playerflags.h> #include <clean_up.h> inherit M_INPUT; inherit M_ACCESS; nosave private function end_func; nosave private object user; nosave private int restrict; private int already_editing = 0; private nomask void receive_ed_input(mixed s) { if(s == -1) { destruct(this_object()); return; } /* Using standard ed() restrictions is not sufficient. Privilege 0 documents * can still be read into the editor from persons who should not be, such as * players. Therefore eliminate a certain set of commands. This includes * all reading and writing commands in the editor. If you have a privilege, * you can, but that generally means that you are a wizard. For some slight * variations of security (like if all of your users have privileges * regardless of status, you might have to do something different here * -- Tigran */ if(restrict&&!this_user()->query_privilege()) { switch(s[0]) { case 'e': case 'E': case 'f': case 'r': case 'w': case 'W': case 'x': tell(this_user(),"Operation not allowed."); } } tell(this_user(), ed_cmd(s), NO_ANSI); if ( query_ed_mode() == -1 ) { modal_pop(); if( already_editing ) --already_editing; else if(this_body()) this_body()->clear_flag(F_IN_EDIT); if ( end_func ) evaluate(end_func); destruct(this_object()); } } private nomask string query_prompt() { int line; line = query_ed_mode(); if ( line == -2 ) return ""; if ( line ) return ""; return ":"; } varargs nomask void begin_editing(string fname, int restricted, function f) { restrict=restricted; modal_push((: receive_ed_input :), (: query_prompt :)); if( this_body() ) { if(this_body()->test_flag( F_IN_EDIT )) already_editing++; else this_body()->set_flag(F_IN_EDIT); } user = this_user(); end_func = f; ed_start(fname, restricted); if(!restricted) printf("Editing: /%s", ed_cmd("f")); if(!is_file(fname)) printf("[New file]\n"); } int set_ed_setup(int code) { user->set_ed_setup(code); } void query_ed_setup() { return user->query_ed_setup(); } private void create() { set_privilege(1); } private int clean_up() { if (query_ed_mode() == -1) destruct(this_object()); return ASK_AGAIN; }