--- parser3/src/main/pa_common.C 2003/02/04 15:59:05 1.143.2.15 +++ parser3/src/main/pa_common.C 2003/02/14 17:38:29 1.143.2.19 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_COMMON_C="$Date: 2003/02/04 15:59:05 $"; +static const char* IDENT_COMMON_C="$Date: 2003/02/14 17:38:29 $"; #include "pa_common.h" #include "pa_exception.h" @@ -93,13 +93,20 @@ static int unlock(int fd) { FLOCK(F_TLOC #endif #endif +// defines for globals + +#define FILE_STATUS_NAME "status" + +// globals + +StringPtr file_status_name(new String(FILE_STATUS_NAME)); + // defines for statics #define HTTP_METHOD_NAME "method" #define HTTP_TIMEOUT_NAME "timeout" #define HTTP_HEADERS_NAME "headers" #define HTTP_ANY_STATUS_NAME "any-status" -#define FILE_STATUS_NAME "status" // statics @@ -107,7 +114,6 @@ static StringPtr http_method_name(new St static StringPtr http_timeout_name(new String(HTTP_TIMEOUT_NAME)); static StringPtr http_headers_name(new String(HTTP_HEADERS_NAME)); static StringPtr http_any_status_name(new String(HTTP_ANY_STATUS_NAME)); -static StringPtr file_status_name(new String(FILE_STATUS_NAME)); // defines @@ -146,10 +152,10 @@ void fix_line_breaks(char* buf, size_t& char* file_read_text(Pool& pool, Charset& charset, StringPtr file_spec, bool fail_on_read_problem, - HashStringValue *params, HashStringValue** out_fields) { - char *result; size_t size; - File_read_result file_read_result=file_read(pool, charset, file_spec, result, size, true, params, out_fields, fail_on_read_problem); - return file_read_result.success?result:0; + HashStringValue* params/*, HashStringValuePtr* out_fields*/) { + File_read_result file= + file_read(pool, charset, file_spec, true, params, fail_on_read_problem); + return file.success?file.data:0; } //http request stuff @@ -293,10 +299,15 @@ static void http_pass_header(HashStringV if(*key->change_case(*info->pool, *info->charset, String::CC_UPPER)=="USER-AGENT") info->user_agent_specified=true; } -static HashStringValuePtr file_read_http(Pool& pool, Charset& charset, StringPtr file_spec, - char*& data, size_t& data_size, - HashStringValue *options=0, bool return_outfields=false) { - HashStringValuePtr result(0); +#ifndef DOXYGEN +struct File_read_http_info { + char **data; size_t *data_size; + HashStringValuePtr headers; +}; +#endif +static File_read_http_info file_read_http(Pool& pool, Charset& charset, StringPtr file_spec, + HashStringValue *options=0) { + File_read_http_info result; char host[MAX_STRING]; const char* uri; int port; @@ -388,7 +399,7 @@ static HashStringValuePtr file_read_http StringPtr body=response.mid(pos+4, response.size()); ArrayString aheaders; - HashStringValuePtr headers(new HashStringValue); + result.headers=HashStringValuePtr(new HashStringValue); header_block->split(aheaders, 0, "\r\n", 2); //processing headers @@ -400,19 +411,16 @@ static HashStringValuePtr file_read_http connect_string, "bad response from host - bad header \"%s\"", line->cstr().get()); - headers->put( + result.headers->put( line->mid(0, pos)->change_case(pool, charset, String::CC_UPPER), ValuePtr(new VString(line->mid(pos+2, line->size())))); } // output response - data=new(pool) char[data_size=body->size()]; - body->store_to(data, String::UL_AS_IS); - if(return_outfields) { - headers->put(file_status_name, ValuePtr(new VInt(status_code))); - return headers; - } else - return HashStringValuePtr(0); + *result.data=new(pool) char[*result.data_size=body->size()]; + body->store_to(*result.data, String::UL_AS_IS); + result.headers->put(file_status_name, ValuePtr(new VInt(status_code))); + return result; } #ifndef DOXYGEN @@ -446,16 +454,15 @@ static void file_read_action(Pool& pool, } } File_read_result file_read(Pool& pool, Charset& charset, StringPtr file_spec, - char*& data, size_t& data_size, - bool as_text, HashStringValue *params, HashStringValue** out_fields, + bool as_text, HashStringValue *params, bool fail_on_read_problem) { File_read_result result; if(file_spec->starts_with("http://", 7)) { // fail on read problem - result.fields=file_read_http(pool, charset, file_spec, data, data_size, params); + result.headers=file_read_http(pool, charset, file_spec, params).headers; result.success=true; } else { - File_read_action_info info={&data, &data_size}; + File_read_action_info info={&result.data, &result.size}; result.success=file_read_action_under_lock(pool, file_spec, "read", file_read_action, &info, as_text, fail_on_read_problem); @@ -463,17 +470,17 @@ File_read_result file_read(Pool& pool, C if(result.success && as_text) { // UTF-8 signature: EF BB BF - if(data_size>=3) { - char *in=(char *)data; + if(result.size>=3) { + char *in=(char *)result.data; if((in[0] == '\xEF') && (in[1] == '\xBB') && (in[2] == '\xBF')) { - data=in+3; data_size-=3;// skip prefix + result.data=in+3; result.size-=3;// skip prefix } } - fix_line_breaks((char *)(data), data_size); + fix_line_breaks((char *)(result.data), result.size); // note: after fixing - ((char*&)(data))[data_size]=0; + ((char*&)(result.data))[result.size]=0; } return result; @@ -602,7 +609,7 @@ bool file_write_action_under_lock( #ifndef DOXYGEN struct File_write_action_info { - const void *data; size_t size; + const char *data; size_t size; }; #endif static void file_write_action(int f, void *context) { @@ -617,7 +624,7 @@ static void file_write_action(int f, voi } void file_write( StringPtr file_spec, - const void *data, size_t size, + const char *data, size_t size, bool as_text, bool do_append) { File_write_action_info info={data, size}; @@ -704,8 +711,8 @@ bool file_readable(StringPtr file_spec) bool dir_readable(StringPtr file_spec) { return entry_readable(file_spec, true); } -StringPtr file_readable(StringPtr path, const String& name) { - StringPtr result(new String(*path)); +StringPtr file_readable(String& path, String& name) { + StringPtr result(new String(path)); *result << "/"; *result << name; return file_readable(result)?result:StringPtr(0);