--- parser3/src/include/pa_request.h 2003/02/03 09:20:59 1.160.2.14 +++ parser3/src/include/pa_request.h 2003/03/18 15:14:16 1.160.2.37.2.1 @@ -8,24 +8,13 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char* IDENT_REQUEST_H="$Date: 2003/02/03 09:20:59 $"; +static const char* IDENT_REQUEST_H="$Date: 2003/03/18 15:14:16 $"; -#include "pa_pool.h" #include "pa_request_info.h" #include "pa_hash.h" #include "pa_wcontext.h" #include "pa_value.h" #include "pa_stack.h" -#include "pa_vclass.h" -#include "pa_vobject.h" -#include "pa_venv.h" -#include "pa_vstatus.h" -#include "pa_vform.h" -#include "pa_vmail.h" -#include "pa_vmath.h" -#include "pa_vrequest.h" -#include "pa_vresponse.h" -#include "pa_vcookie.h" #include "pa_request_info.h" #include "pa_request_charsets.h" #include "pa_sapi.h" @@ -36,7 +25,7 @@ static const char* IDENT_REQUEST_H="$Dat // consts -const uint ANTI_ENDLESS_EXECUTE_RECOURSION=500; +const uint ANTI_ENDLESS_EXECUTE_RECOURSION=1000; // defines @@ -58,6 +47,12 @@ const uint ANTI_ENDLESS_EXECUTE_RECOURSI class Temp_lang; class Methoded; class VMethodFrame; +class GdomeDOMString_auto_ptr; +class VMail; DECLARE_OBJECT_PTR(VMail); +class VForm; DECLARE_OBJECT_PTR(VForm); +class VResponse; DECLARE_OBJECT_PTR(VResponse); +class VCookie; DECLARE_OBJECT_PTR(VCookie); +class VStateless_class; DECLARE_OBJECT_PTR(VStateless_class); /// Main workhorse. class Request: public PA_Object { @@ -67,7 +62,7 @@ class Request: public PA_Object { friend class Temp_request_self; /// all files and classes and other hard-to-place allocations go to this pool - Pool fpool; + Pool& fpool; ///@{ core data @@ -75,7 +70,7 @@ class Request: public PA_Object { HashStringValue fclasses; /// already used files to avoid cyclic uses - Hash used_files; + Hash used_files; /** endless execute(execute(... preventing counter @see ANTI_ENDLESS_EXECUTE_RECOURSION @@ -88,22 +83,21 @@ public: class StackItem { public: - StringPtr string; + const String& string() const { return value->get_string(&pool); } ValuePtr value; ArrayOperationPtr ops; - void *unknown; + void *ptr; /// needed to fill unused Array entries StackItem() {} - StackItem(StringPtr astring): string(astring) {} StackItem(ValuePtr avalue): value(avalue) {} StackItem(ArrayOperationPtr aops): ops(aops) {} - StackItem(void *aunknown): unknown(aunknown) {} + StackItem(void *aptr): ptr(aptr) {} }; //@{ request processing status /// exception stack trace - Stack exception_trace; + Stack exception_trace; /// execution stack Stack stack; /// contexts @@ -111,7 +105,7 @@ public: Value *rcontext; WContext *wcontext; /// current language - uchar flang; + String_UL flang; /// current connection SQL_Connection *fconnection; //@} @@ -121,7 +115,7 @@ public: public: /// all files and classes and other hard-to-place allocations go to this pool - Pool& pool() { return fpool; } + () { return fpool; } #ifdef RESOURCES_DEBUG /// measures @@ -130,7 +124,7 @@ public: #endif Request(SAPI_Info& asapi_info, Request_info& arequest_info, - uchar adefault_lang, ///< all tainted data default untainting lang + String_UL adefault_lang, ///< all tainted data default untainting lang bool status_allowed ///< status class allowed ); ~Request(); @@ -151,7 +145,7 @@ public: /// executes ops void execute(ArrayOperation& ops); // execute.C /// execute ops with anti-recoursion check - void recoursion_checked_execute(StringPtr name, ArrayOperation& ops) { + 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 @@ -164,19 +158,19 @@ public: } /// compiles the file, maybe forcing it's class @a name and @a base_class. - VStateless_classPtr use_file(VStateless_class& aclass, - StringPtr file_name, + void use_file(VStateless_class& aclass, + const String& file_name, bool ignore_class_path=false, bool fail_on_read_problem=true, bool fail_on_file_absence=true); // pa_request.C /// compiles a @a source buffer - VStateless_classPtr use_buf(VStateless_class& aclass, + void use_buf(VStateless_class& aclass, const char* source, - StringPtr filespec, const char* filespec_cstr); // pa_request.C + const String& filespec, const char* filespec_cstr); // pa_request.C /// processes any code-junction there may be inside of @a value StringOrValue process(ValuePtr input_value, bool intercept_string=true); // execute.C //@{ convinient helpers - StringPtr process_to_string(ValuePtr input_value) { + const String& process_to_string(ValuePtr input_value) { return process(input_value, true/*intercept_string*/).as_string(&pool()); } ValuePtr process_to_value(ValuePtr input_value, bool intercept_string=true) { @@ -187,14 +181,14 @@ public: #define DEFINE_DUAL(modification) \ void write_##modification##_lang(StringOrValue dual) { \ - if(StringPtr string=dual.get_string()) \ + if(const String& string=dual.get_string()) \ write_##modification##_lang(*string); \ else \ write_##modification##_lang(dual.get_value()); \ } #define DEFINE_DUAL_CHECKED(modification) \ - void write_##modification##_lang(StringOrValue dual, StringPtr origin) { \ - if(StringPtr string=dual.get_string()) \ + void write_##modification##_lang(StringOrValue dual, const String& origin) { \ + if(const String& string=dual.get_string()) \ write_##modification##_lang(*string); \ else \ write_##modification##_lang(dual.get_value(), origin); \ @@ -229,7 +223,7 @@ public: wcontext->write(pool(), avalue, flang); } /// appending possible string, assigning untaint language - void write_assign_lang(ValuePtr avalue, StringPtr origin) { + void write_assign_lang(ValuePtr avalue, const String& origin) { wcontext->write(pool(), avalue, flang, origin); } /// appending string, assigning untaint language @@ -240,16 +234,16 @@ public: DEFINE_DUAL_CHECKED(assign) /// returns relative to @a path path to @a file - StringPtr relative(const char* apath, StringPtr relative_name); + const String& relative(const char* apath, const String& relative_name); /// returns an absolute @a path to relative @a name - StringPtr absolute(StringPtr relative_name); + const String& absolute(const String& relative_name); /// returns the mime type of 'user_file_name_cstr' - StringPtr mime_type_of(const char* user_file_name_cstr); + const String& mime_type_of(const char* user_file_name_cstr); /// returns current SQL connection if any - SQL_Connection *connection(StringPtr source) { + SQL_Connection *connection(const String* source) { if(!fconnection && source) throw Exception("parser.runtime", source, @@ -260,8 +254,8 @@ public: bool origins_mode(); - void interrupt() { finterrupted=true; } - bool interrupted() { return finterrupted; } + void set_interrupted(bool ainterrupted) { finterrupted=ainterrupted; } + bool get_interrupted() { return finterrupted; } public: @@ -276,37 +270,58 @@ public: /// 'MAIN' class conglomerat & operators are methods of this class VStateless_classPtr main_class; - /// $env:fields - //VEnv env; - /// $status:fields - //VStatus status; /// $form:elements VFormPtr form; /// $mail VMailPtr mail; - /// $math:constants - //VMath math; - /// $request:elements - //VRequest request; /// $response:elements VResponsePtr response; /// $cookie:elements VCookiePtr cookie; /// classes configured data - HashStringValue classes_conf; + HashStringObject classes_conf; public: // status read methods VMethodFrame *get_method_frame() { return method_frame; } ValuePtr get_self(); +#define GET_SELF(request, type) (*static_cast(request.get_self().get())) + /* for strange reason call to this: + r.get_self() + refuses to compile + + template T& get_self() { + return *static_cast(get_self().get()); + } + */ + +#ifdef XML +public: // charset helpers + + /// @see Charset::transcode + GdomeDOMString_auto_ptr transcode(const String& s); + /// @see Charset::transcode + const String& transcode(GdomeDOMString* s +#ifndef NO_STRING_ORIGIN + , const String& origin +#endif + ); + /// @see Charset::transcode + const String& transcode(xmlChar* s +#ifndef NO_STRING_ORIGIN + , const String& origin +#endif + ); + +#endif private: /// already executed some @conf method bool configure_admin_done; - void configure_admin(VStateless_class& conf_class, StringPtr source); + void configure_admin(VStateless_class& conf_class, const String* source); private: // compile.C @@ -315,25 +330,27 @@ private: // compile.C private: // execute.C /// for @postprocess[body] - StringPtr execute_method(VMethodFrame& amethodFrame, const Method& method); + const String& execute_method(VMethodFrame& amethodFrame, const Method& method); //{ for @conf[filespec] and @auto[filespec] - StringPtr execute_method(ValuePtr aself, - const Method& method, VStringPtr optional_param, + const String& execute_method(ValuePtr aself, + const Method& method, Vconst String& optional_param, + bool do_return_string); + struct Execute_nonvirtual_method_result { + const String& string; + MethodPtr method; + }; + Execute_nonvirtual_method_result execute_nonvirtual_method(VStateless_class& aclass, + const String& method_name, Vconst String& optional_param, bool do_return_string); - StringPtr execute_nonvirtual_method(VStateless_class& aclass, - StringPtr method_name, VStringPtr optional_param, - bool do_return_string, - const Method **return_method=0); //} /// for @main[] - StringPtr execute_virtual_method(ValuePtr aself, StringPtr method_name); + const String& execute_virtual_method(ValuePtr aself, const String& method_name); - ValuePtr get_element(StringPtr& remember_name, bool can_call_operator); + ValuePtr get_element(String* & remember_name, bool can_call_operator); private: // defaults - const uchar fdefault_lang; - Value *default_content_type; + const String_UL fdefault_lang; private: // mime types @@ -342,12 +359,12 @@ private: // mime types private: // lang manipulation - uchar set_lang(uchar alang) { - uchar result=flang; + String_UL set_lang(String_UL alang) { + String_UL result=flang; flang=alang; return result; } - void restore_lang(uchar alang) { + void restore_lang(String_UL alang) { flang=alang; } @@ -380,7 +397,7 @@ class Request_context_saver { Value *rcontext; WContext *wcontext; /// current language - uchar flang; + String_UL flang; /// current connection SQL_Connection *fconnection; @@ -406,9 +423,9 @@ public: /// Auto-object used for temporary changing Request::flang. class Temp_lang { Request& frequest; - uchar saved_lang; + String_UL saved_lang; public: - Temp_lang(Request& arequest, uchar alang) : + Temp_lang(Request& arequest, String_UL alang) : frequest(arequest), saved_lang(arequest.set_lang(alang)) { } @@ -431,8 +448,25 @@ public: } }; + +// defines for externs + +#define CONTENT_DISPOSITION_NAME "content-disposition" +#define CONTENT_DISPOSITION_VALUE "attachment" +#define CONTENT_DISPOSITION_FILENAME_NAME "filename" + // externs -extern StringPtr main_method_name; +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; + +// defines for statics + +#define MAIN_CLASS_NAME "MAIN" +#define AUTO_FILE_NAME "auto.p" #endif