--- parser3/src/include/pa_request.h 2005/08/09 08:14:50 1.179 +++ parser3/src/include/pa_request.h 2010/05/25 03:58:17 1.201 @@ -1,14 +1,14 @@ /** @file Parser: request class decl. - Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char * const IDENT_REQUEST_H="$Date: 2005/08/09 08:14:50 $"; +static const char * const IDENT_REQUEST_H="$Date: 2010/05/25 03:58:17 $"; #include "pa_pool.h" #include "pa_hash.h" @@ -18,6 +18,7 @@ static const char * const IDENT_REQUEST_ #include "pa_request_info.h" #include "pa_request_charsets.h" #include "pa_sapi.h" +#include "pa_vconsole.h" #ifdef RESOURCES_DEBUG #include @@ -33,7 +34,6 @@ const size_t pseudo_file_no__process=1; class Temp_lang; class Methoded; class VMethodFrame; -class GdomeDOMString_auto_ptr; class VMail; class VForm; class VResponse; @@ -64,6 +64,12 @@ public: const Operation::Origin origin() const { return forigin; } }; + enum Skip { + SKIP_NOTHING, + SKIP_BREAK, + SKIP_CONTINUE + }; + private: Pool fpool; public: @@ -99,11 +105,11 @@ private: element_type bottom_value() { return get(bottom_index()); } void clear() { - ftop=fbottom=0; + fused=fbottom=0; } bool is_empty() { - return ftop==fbottom; + return fused==fbottom; } const element_type extract_origin(const String*& problem_source); @@ -112,10 +118,11 @@ private: ///@{ core data /// classes - HashStringValue fclasses; + HashString fclasses; /// already used files to avoid cyclic uses - Hash used_files; + HashString used_files; + HashString searched_along_class_path; /// list of all used files, Operation::file_no = index to it Array file_list; @@ -145,6 +152,8 @@ public: //@} /// interrupted flag, raised on signals [SIGPIPE] bool finterrupted; + Skip fskip; + int fin_cycle; public: uint register_file(String::Body file_spec); @@ -180,7 +189,8 @@ public: ~Request(); /// global classes - HashStringValue& classes() { return fclasses; } + HashString& classes() { return fclasses; } + Value* get_class(const String& name); /** core request processing @@ -194,12 +204,15 @@ public: /// executes ops void execute(ArrayOperation& ops); // execute.C + void op_call(VMethodFrame &frame); + void op_call_write(VMethodFrame &frame); + void op_call(VMethodFrame &frame, bool constructing); /// execute ops with anti-recoursion check void recoursion_checked_execute(/*const String& name, */ArrayOperation& ops) { // anti_endless_execute_recoursion if(++anti_endless_execute_recoursion==ANTI_ENDLESS_EXECUTE_RECOURSION) { anti_endless_execute_recoursion=0; // give @exception a chance - throw Exception("parser.runtime", + throw Exception(PARSER_RUNTIME, 0, //&name, "call canceled - endless recursion detected"); } @@ -207,22 +220,27 @@ public: anti_endless_execute_recoursion--; } + /// + void use_file_directly(VStateless_class& aclass, + const String& file_spec, + bool fail_on_read_problem=true, + bool fail_on_file_absence=true); + /// compiles the file, maybe forcing it's class @a name and @a base_class. void use_file(VStateless_class& aclass, - const String& file_name, - const String* main_alias=0, - bool ignore_class_path=false, - bool fail_on_read_problem=true, - bool fail_on_file_absence=true); // pa_request.C + const String& file_name, + const String* use_filespec); + /// compiles a @a source buffer void use_buf(VStateless_class& aclass, const char* source, const String* main_alias, uint file_no, - int line_no_offset=0); // pa_request.C + int line_no_offset=0); /// processes any code-junction there may be inside of @a value StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C + void process_write(Value& input_value); // execute.C //@{ convinient helpers const String& process_to_string(Value& input_value) { return process(input_value, true/*intercept_string*/).as_string(); @@ -231,7 +249,8 @@ public: return process(input_value, intercept_string).as_value(); } //@} - + const String* get_method_filename(const Method* method); // execute.C + const String* get_used_filename(uint file_no); #define DEFINE_DUAL(modification) \ void write_##modification##_lang(StringOrValue dual) { \ @@ -287,7 +306,7 @@ public: /// returns current SQL connection if any SQL_Connection* connection(bool fail_on_error=true) { if(fail_on_error && !fconnection) - throw Exception("parser.runtime", + throw Exception(PARSER_RUNTIME, 0, "outside of 'connect' operator"); @@ -297,6 +316,12 @@ public: void set_interrupted(bool ainterrupted) { finterrupted=ainterrupted; } bool get_interrupted() { return finterrupted; } + void set_skip(Skip askip) { fskip=askip; } + Skip get_skip() { return fskip; } + + void set_in_cycle(int adelta) { fin_cycle+=adelta; } + bool get_in_cycle() { return fin_cycle>0; } + public: /// info from web server @@ -318,9 +343,11 @@ public: VResponse& response; /// $cookie:elements VCookie& cookie; + /// $console + VConsole& console; /// classes configured data - Hash classes_conf; + HashString classes_conf; public: // status read methods @@ -343,7 +370,7 @@ public: // status read methods StringOrValue execute_method(VMethodFrame& amethodFrame, const Method& method); //{ for @conf[filespec] and @auto[filespec] and parser://method/call const String* execute_method(Value& aself, - const Method& method, VString* optional_param, + const Method& method, Value* optional_param, bool do_return_string); struct Execute_nonvirtual_method_result { const String* string; @@ -351,7 +378,8 @@ public: // status read methods Execute_nonvirtual_method_result(): string(0), method(0) {} }; Execute_nonvirtual_method_result execute_nonvirtual_method(VStateless_class& aclass, - const String& method_name, VString* optional_param, + const String& method_name, + VString* optional_param, bool do_return_string); //} @@ -359,13 +387,11 @@ public: // status read methods public: // charset helpers /// @see Charset::transcode - GdomeDOMString_auto_ptr transcode(const String& s); + xmlChar* transcode(const String& s); /// @see Charset::transcode - GdomeDOMString_auto_ptr transcode(const String::Body s); + xmlChar* transcode(const String::Body s); /// @see Charset::transcode - const String& transcode(GdomeDOMString* s); - /// @see Charset::transcode - const String& transcode(xmlChar* s); + const String& transcode(const xmlChar* s); #endif @@ -380,15 +406,15 @@ private: private: // compile.C - VStateless_class& compile(VStateless_class* aclass, + ArrayClass& compile(VStateless_class* aclass, const char* source, const String* main_alias, uint file_no, int line_no_offset); private: // execute.C - void put_element(Value& ncontext, const String& name, Value& value); - Value& get_element(Value& ncontext, const String& name, bool can_call_operator); + void put_element(Value& ncontext, const String& name, Value* value); + Value& get_element(Value& ncontext, const String& name); private: // defaults @@ -496,12 +522,20 @@ public: } }; +/// Auto-object used for break out of cycle check +class InCycle { + Request& frequest; +public: + InCycle(Request& arequest) : frequest(arequest) { + frequest.set_in_cycle(1); + } + ~InCycle() { + frequest.set_in_cycle(-1); + } +}; // defines for externs -#define CONTENT_DISPOSITION_NAME "content-disposition" -#define CONTENT_DISPOSITION_VALUE "attachment" -#define CONTENT_DISPOSITION_FILENAME_NAME "filename" #define EXCEPTION_HANDLED_PART_NAME "handled" @@ -510,9 +544,6 @@ public: extern const String main_method_name; extern const String auto_method_name; extern const String body_name; -extern const String content_disposition_name; -extern const String content_disposition_value; -extern const String content_disposition_filename_name; extern const String exception_type_part_name; extern const String exception_source_part_name;