--- parser3/src/classes/file.C 2001/11/05 11:46:20 1.65 +++ parser3/src/classes/file.C 2002/03/25 11:55:26 1.73 @@ -1,10 +1,10 @@ /** @file Parser: @b file parser class. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://paf.design.ru) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) - $Id: file.C,v 1.65 2001/11/05 11:46:20 paf Exp $ + $Id: file.C,v 1.73 2002/03/25 11:55:26 paf Exp $ */ #include "pa_config_includes.h" @@ -20,6 +20,7 @@ #include "pa_vdate.h" #include "pa_dir.h" #include "pa_vtable.h" +#include "pa_charset.h" // consts @@ -60,20 +61,18 @@ static void _save(Request& r, const Stri } static void _delete(Request& r, const String&, MethodParams *params) { - Pool& pool=r.pool(); Value& vfile_name=params->as_no_junction(0, "file name must not be code"); // unlink - file_delete(pool, r.absolute(vfile_name.as_string())); + file_delete(r.absolute(vfile_name.as_string())); } static void _move(Request& r, const String&, MethodParams *params) { - Pool& pool=r.pool(); Value& vfrom_file_name=params->as_no_junction(0, "from file name must not be code"); Value& vto_file_name=params->as_no_junction(1, "to file name must not be code"); // move - file_move(pool, + file_move( r.absolute(vfrom_file_name.as_string()), r.absolute(vto_file_name.as_string())); } @@ -193,7 +192,7 @@ static void _exec_cgi(Request& r, const // from Request.info ECSTR(DOCUMENT_ROOT, r.info.document_root); ECSTR(PATH_TRANSLATED, r.info.path_translated); - ECSTR(SERVER_PROTOCOL, r.info.method); + ECSTR(REQUEST_METHOD, r.info.method); ECSTR(QUERY_STRING, r.info.query_string); ECSTR(REQUEST_URI, r.info.uri); ECSTR(CONTENT_TYPE, r.info.content_type); @@ -204,6 +203,7 @@ static void _exec_cgi(Request& r, const ECSTR(HTTP_COOKIE, r.info.cookie); ECSTR(HTTP_USER_AGENT, r.info.user_agent); // passing some SAPI:get_env-s + EPASS(SERVER_PROTOCOL); EPASS(SERVER_NAME); EPASS(SERVER_PORT); EPASS(HTTP_REFERER); @@ -236,7 +236,7 @@ static void _exec_cgi(Request& r, const //out.APPEND_CONST("content-type:text/plain\nheader:test-header\n\ntest-body"); //out<(r.self); @@ -311,7 +311,7 @@ static void _list(Request& r, const Stri int erroffset; regexp_code=pcre_compile(pattern, PCRE_EXTRA | PCRE_DOTALL, &errptr, &erroffset, - r.pcre_tables()); + pool.get_client_charset().pcre_tables); if(!regexp_code) throw Exception(0, 0, @@ -371,6 +371,26 @@ static void _list(Request& r, const Stri r.write_no_lang(result); } +#ifndef DOXYGEN +struct Lock_execute_body_info { + Request *r; + Value *body_code; +}; +#endif +static void lock_execute_body(int , void *context) { + Lock_execute_body_info& info=*static_cast(context); + + // execute body + info.r->write_assign_lang(info.r->process(*info.body_code)); +}; +static void _lock(Request& r, const String& method_name, MethodParams *params) { + const String& file_spec=r.absolute(params->as_string(0, "file name must be string")); + Value& body_code=params->as_junction(1, "body must be code"); + + Lock_execute_body_info info={&r, &body_code}; + file_write_action_under_lock(file_spec, "lock", lock_execute_body, &info); +} + // constructor MFile::MFile(Pool& apool) : Methoded(apool) { @@ -411,6 +431,9 @@ MFile::MFile(Pool& apool) : Methoded(apo // ^file:list[path][regexp] add_native_method("list", Method::CT_STATIC, _list, 1, 2); + // ^file:lock[path]{code} + add_native_method("lock", Method::CT_STATIC, _lock, 2, 2); + } // global variable