--- parser3/src/include/pa_request.h 2009/06/16 08:39:00 1.194 +++ parser3/src/include/pa_request.h 2010/05/20 04:35:59 1.199 @@ -8,7 +8,7 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char * const IDENT_REQUEST_H="$Date: 2009/06/16 08:39:00 $"; +static const char * const IDENT_REQUEST_H="$Date: 2010/05/20 04:35:59 $"; #include "pa_pool.h" #include "pa_hash.h" @@ -118,7 +118,7 @@ private: ///@{ core data /// classes - HashStringValue fclasses; + HashString fclasses; /// already used files to avoid cyclic uses HashString used_files; @@ -152,6 +152,7 @@ public: /// interrupted flag, raised on signals [SIGPIPE] bool finterrupted; Skip fskip; + int fin_cycle; public: uint register_file(String::Body file_spec); @@ -187,7 +188,8 @@ public: ~Request(); /// global classes - HashStringValue& classes() { return fclasses; } + HashString& classes() { return fclasses; } + Value* get_class(const String& name); /** core request processing @@ -217,13 +219,17 @@ 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); // pa_request.C + /// 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); // pa_request.C + /// compiles a @a source buffer void use_buf(VStateless_class& aclass, const char* source, @@ -242,7 +248,8 @@ public: return process(input_value, intercept_string).as_value(); } //@} - + const String* get_method_filename(const Method* method); + const String* get_used_filename(uint file_no); #define DEFINE_DUAL(modification) \ void write_##modification##_lang(StringOrValue dual) { \ @@ -311,6 +318,9 @@ public: 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 @@ -511,15 +521,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_TRANSFER_ENCODING_NAME "content-transfer-encoding" -#define CONTENT_DISPOSITION_NAME "content-disposition" -#define CONTENT_DISPOSITION_ATTACHMENT "attachment" -#define CONTENT_DISPOSITION_INLINE "inline" -#define CONTENT_DISPOSITION_FILENAME_NAME "filename" - #define EXCEPTION_HANDLED_PART_NAME "handled" @@ -529,12 +544,6 @@ extern const String main_method_name; extern const String auto_method_name; extern const String body_name; -extern const String content_transfer_encoding_name; -extern const String content_disposition_name; -extern const String content_disposition_attachment; -extern const String content_disposition_inline; -extern const String content_disposition_filename_name; - extern const String exception_type_part_name; extern const String exception_source_part_name; extern const String exception_comment_part_name;