--- parser3/src/include/pa_request.h 2010/05/25 03:58:17 1.201 +++ parser3/src/include/pa_request.h 2013/09/30 19:40:57 1.213 @@ -1,14 +1,14 @@ /** @file Parser: request class decl. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (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: 2010/05/25 03:58:17 $"; +#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.213 2013/09/30 19:40:57 moko Exp $" #include "pa_pool.h" #include "pa_hash.h" @@ -20,10 +20,6 @@ static const char * const IDENT_REQUEST_ #include "pa_sapi.h" #include "pa_vconsole.h" -#ifdef RESOURCES_DEBUG -#include -#endif - // consts const uint ANTI_ENDLESS_EXECUTE_RECOURSION=1000; @@ -140,6 +136,8 @@ private: Exception_trace exception_trace; public: + bool allow_class_replace; + //@{ request processing status /// contexts VMethodFrame* method_frame; @@ -183,8 +181,7 @@ public: #endif Request(SAPI_Info& asapi_info, Request_info& arequest_info, - String::Language adefault_lang, ///< all tainted data default untainting lang - bool status_allowed ///< status class allowed + String::Language adefault_lang ///< all tainted data default untainting lang ); ~Request(); @@ -206,7 +203,8 @@ public: void execute(ArrayOperation& ops); // execute.C void op_call(VMethodFrame &frame); void op_call_write(VMethodFrame &frame); - void op_call(VMethodFrame &frame, bool constructing); + Value& construct(Value &class_value, const Method &method); + /// execute ops with anti-recoursion check void recoursion_checked_execute(/*const String& name, */ArrayOperation& ops) { // anti_endless_execute_recoursion @@ -239,6 +237,7 @@ public: int line_no_offset=0); /// processes any code-junction there may be inside of @a value + StringOrValue process_getter(Junction& junction); // execute.C StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C void process_write(Value& input_value); // execute.C //@{ convinient helpers @@ -300,6 +299,9 @@ public: /// returns an absolute @a path to relative @a name const String& absolute(const String& relative_name); + /// returns the mime type of 'user_file_name' + const String& mime_type_of(const String* file_name); + /// returns the mime type of 'user_file_name_cstr' const String& mime_type_of(const char* user_file_name_cstr); @@ -363,11 +365,15 @@ public: // status read methods } */ + /// public for ^reflection:copy[] + void put_element(Value& ncontext, const String& name, Value* value); + /// for @main[] const String* execute_virtual_method(Value& aself, const String& method_name); - /// for @postprocess[body] - StringOrValue execute_method(VMethodFrame& amethodFrame, const Method& method); + /// executes parser method, use op_call(frame) to execute native method + void execute_method(VMethodFrame& aframe); + //{ for @conf[filespec] and @auto[filespec] and parser://method/call const String* execute_method(Value& aself, const Method& method, Value* optional_param, @@ -413,7 +419,6 @@ private: // compile.C private: // execute.C - void put_element(Value& ncontext, const String& name, Value* value); Value& get_element(Value& ncontext, const String& name); private: // defaults @@ -534,6 +539,18 @@ public: } }; +/// Auto-object used for temporary changing Request::allow_class_replace. +class Temp_class_replace { + Request& frequest; +public: + Temp_class_replace(Request& arequest, bool avalue) : frequest(arequest){ + frequest.allow_class_replace=avalue; + } + ~Temp_class_replace() { + frequest.allow_class_replace=false; + } +}; + // defines for externs #define EXCEPTION_HANDLED_PART_NAME "handled"