|
|
#include <module.h> |
#include <roxen.h> |
|
|
|
|
#define LOCALE(X,Y) \ |
([string](mixed)Locale.translate("roxen_config",roxenp()->locale->get(),X,Y)) |
|
|
static int unique_vid; |
|
|
|
|
|
static mapping(int:mixed) changed_values = ([]); |
static mapping(int:function(object:void)) changed_callbacks = ([]); |
static mapping(int:int) all_flags = ([]); |
static mapping(int:string) all_warnings = ([]); |
static mapping(int:function(RequestID,object:int)) |
invisibility_callbacks = set_weak_flag( ([]), 1 ); |
|
class Variable |
|
|
{ |
constant is_variable = 1; |
|
constant type = "Basic"; |
|
|
int _id = unique_vid++; |
|
|
static mixed _initial; |
static string _path = sprintf("v%x",_id); |
static LocaleString __name, __doc; |
|
void destroy() |
{ |
|
m_delete( all_flags, _id ); |
m_delete( all_warnings, _id ); |
m_delete( invisibility_callbacks, _id ); |
m_delete( changed_values, _id ); |
} |
|
string get_warnings() |
|
{ |
return all_warnings[ _id ]; |
} |
|
int get_flags() |
|
|
|
|
|
|
|
{ |
return all_flags[_id]; |
} |
|
void set_flags( int flags ) |
|
|
|
|
|
|
|
{ |
if(!flags ) |
m_delete( all_flags, _id ); |
else |
all_flags[_id] = flags; |
} |
|
int check_visibility( RequestID id, |
int more_mode, |
int expert_mode, |
int devel_mode, |
int initial, |
int|void variable_in_cfif ) |
|
|
|
|
|
|
|
{ |
int flags = get_flags(); |
function cb; |
if( flags & VAR_INVISIBLE ) return 0; |
if( initial && !(flags & VAR_INITIAL) ) return 0; |
if( (flags & VAR_EXPERT) && !expert_mode ) return 0; |
if( (flags & VAR_MORE) && !more_mode ) return 0; |
if( (flags & VAR_DEVELOPER) && !devel_mode ) return 0; |
if( (flags & VAR_NOT_CFIF) && variable_in_cfif ) return 0; |
if( (cb = get_invisibility_check_callback() ) && |
cb( id, this_object() ) ) |
return 0; |
return 1; |
} |
|
void set_invisibility_check_callback( function(RequestID,Variable:int) cb ) |
|
|
|
|
{ |
if( functionp( cb ) ) |
invisibility_callbacks[ _id ] = cb; |
else |
m_delete( invisibility_callbacks, _id ); |
} |
|
function(Variable:void) get_changed_callback( ) |
|
{ |
return changed_callbacks[ _id ]; |
} |
|
void set_changed_callback( function(Variable:void) cb ) |
|
|
|
|
{ |
if( functionp( cb ) ) |
changed_callbacks[ _id ] = cb; |
else |
m_delete( changed_callbacks, _id ); |
} |
|
void add_changed_callback( function(Variable:void) cb ) |
|
|
|
{ |
mixed oc = get_changed_callback( ); |
if( arrayp( oc ) ) |
oc += ({ cb }); |
else |
oc = ({ oc, cb }) - ({ 0 }); |
changed_callbacks[ _id ] = oc; |
} |
|
function(RequestID,Variable:int) get_invisibility_check_callback() |
|
{ |
return invisibility_callbacks[_id]; |
} |
|
LocaleString doc( ) |
|
|
|
|
{ |
return __doc || ""; |
} |
|
LocaleString name( ) |
|
|
|
|
{ |
return __name || LOCALE(326,"unnamed")+" "+_id; |
} |
|
LocaleString type_hint( ) |
|
|
|
{ |
} |
|
mixed default_value() |
|
{ |
return _initial; |
} |
|
void set_warning( string to ) |
|
{ |
if( to && strlen(to) ) |
all_warnings[ _id ] = to; |
else |
m_delete( all_warnings, _id ); |
} |
|
void add_warning( string to ) |
|
{ |
if(to) set_warning( (get_warnings()||"") + to ); |
} |
|
int set( mixed to ) |
|
|
|
|
|
|
|
|
|
|
|
{ |
string err, e2; |
if( e2 = catch( [err,to] = verify_set( to )) ) |
{ |
if( stringp( e2 ) ) |
{ |
add_warning( e2 ); |
return ([])[0]; |
} |
throw( e2 ); |
} |
add_warning( err ); |
return low_set( to ); |
} |
|
int low_set( mixed to ) |
|
|
|
|
{ |
if( equal( to, query() ) ) |
return 0; |
|
if( !equal(to, default_value() ) ) |
{ |
changed_values[ _id ] = to; |
if( get_changed_callback() ) |
catch( get_changed_callback()( this_object() ) ); |
return 1; |
} |
else |
{ |
m_delete( changed_values, _id ); |
if( get_changed_callback() ) |
catch( get_changed_callback()( this_object() ) ); |
return -1; |
} |
} |
|
mixed query() |
|
{ |
mixed v; |
if( !zero_type( v = changed_values[ _id ] ) ) |
return v; |
return default_value(); |
} |
|
int is_defaulted() |
|
{ |
return zero_type( changed_values[ _id ] ) || |
equal(changed_values[ _id ], default_value()); |
} |
|
array(string|mixed) verify_set_from_form( mixed new_value ) |
|
|
{ |
return ({ 0, new_value }); |
} |
|
array(string|mixed) verify_set( mixed new_value ) |
|
|
|
|
|
|
|
|
{ |
return ({ 0, new_value }); |
} |
|
mapping(string:string) get_form_vars( RequestID id ) |
|
{ |
string p = path(); |
array names = glob( p+"*", indices(id->variables) ); |
mapping res = ([ ]); |
foreach( sort(names), string n ) |
res[ n[strlen(p).. ] ] = id->variables[ n ]; |
return res; |
} |
|
mixed transform_from_form( string what ) |
|
|
{ |
return what; |
} |
|
void set_from_form( RequestID id ) |
|
|
|
|
|
|
|
|
{ |
mixed val; |
if( sizeof( val = get_form_vars(id)) && val[""] && |
(val = transform_from_form( val[""] )) != query() ) |
{ |
array b; |
mixed q = catch( b = verify_set_from_form( val ) ); |
if( q || sizeof( b ) != 2 ) |
{ |
if( q ) |
add_warning( q ); |
else |
add_warning( "Internal error: Illegal sized array " |
"from verify_set_from_form\n" ); |
return; |
} |
if( b ) |
{ |
set_warning( b[0] ); |
set( b[1] ); |
} |
} |
} |
|
string path() |
|
|
|
|
|
|
|
|
{ |
return _path; |
} |
|
void set_path( string to ) |
|
|
|
|
|
|
{ |
_path = to; |
} |
|
string render_form( RequestID id, void|mapping additional_args ); |
|
|
|
|
string render_view( RequestID id ) |
|
{ |
mixed v = query(); |
if( arrayp(v) ) v = map(v,lambda(mixed v){return(string)v;})*", " ; |
return Roxen.html_encode_string( (string)v ); |
} |
|
static string _sprintf( int i ) |
{ |
if( i == 'O' ) |
return sprintf( "Variable.%s(%s)",type,(string)name()); |
} |
|
static void create(mixed default_value, void|int flags, |
void|LocaleString std_name, void|LocaleString std_doc) |
|
|
|
|
|
|
|
|
|
|
{ |
set_flags( flags ); |
_initial = default_value; |
__name = std_name; |
__doc = std_doc; |
} |
} |
|
|
|
|
|
|
|
|
class Float |
|
{ |
inherit Variable; |
constant type = "Float"; |
static float _max, _min; |
static int _prec = 2; |
|
static string _format( float m ) |
{ |
if( !_prec ) |
return sprintf( "%d", (int)m ); |
return sprintf( "%1."+_prec+"f", m ); |
} |
|
void set_range(float minimum, float maximum ) |
|
|
{ |
_max = maximum; |
_min = minimum; |
} |
|
void set_precision( int prec ) |
|
|
|
{ |
_prec = prec; |
} |
|
array(string|float) verify_set( float new_value ) |
{ |
string warn; |
if( new_value > _max && _max > _min) |
{ |
warn = sprintf(LOCALE(328,"Value is bigger than %s, adjusted"), |
_format(_max) ); |
new_value = _max; |
} |
else if( new_value < _min && _min < _max) |
{ |
warn = sprintf(LOCALE(329,"Value is less than %s, adjusted"), |
_format(_min) ); |
new_value = _min; |
} |
return ({ warn, new_value }); |
} |
|
float transform_from_form( string what ) |
{ |
return (float)what; |
} |
|
string render_view( RequestID id ) |
{ |
return Roxen.html_encode_string( _format(query()) ); |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
int size = 15; |
if( _max != _min ) |
size = max( strlen(_format(_max)), strlen(_format(_min)) )+2; |
return input(path(), (query()==""?"":_format(query())), size, additional_args); |
} |
} |
|
|
|
|
|
|
|
|
class Int |
|
{ |
inherit Variable; |
constant type = "Int"; |
static int _max, _min; |
|
void set_range(int minimum, int maximum ) |
|
|
{ |
_max = maximum; |
_min = minimum; |
} |
|
array(string|int) verify_set( mixed new_value ) |
{ |
string warn; |
if(!intp( new_value ) ) |
return ({ sprintf(LOCALE(152,"%O is not an integer"),new_value), |
query() }); |
if( new_value > _max && _max > _min ) |
{ |
warn = sprintf(LOCALE(328,"Value is bigger than %s, adjusted"), |
(string)_max ); |
new_value = _max; |
} |
else if( new_value < _min && _min < _max) |
{ |
warn = sprintf(LOCALE(329,"Value is less than %s, adjusted"), |
(string)_min ); |
new_value = _min; |
} |
return ({ warn, new_value }); |
} |
|
int transform_from_form( mixed what ) |
{ |
sscanf( what, "%d", what ); |
return what; |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
int size = 10; |
if( _min != _max ) |
size = max( strlen((string)_max), strlen((string)_min) )+2; |
return input(path(), (string)query(), size, additional_args); |
} |
} |
|
|
|
|
|
class String |
|
{ |
inherit Variable; |
constant type = "String"; |
constant width = 40; |
|
|
array(string) verify_set_from_form( string new ) |
{ |
return ({ 0, new-"\r" }); |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
return input(path(), (string)query(), width, additional_args); |
} |
} |
|
|
|
|
class Text |
|
{ |
inherit String; |
constant type = "Text"; |
constant cols = 60; |
|
constant rows = 10; |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
return "<textarea cols='"+cols+"' rows='"+rows+"' name='"+path()+"'>" |
+ Roxen.html_encode_string( query() || "" ) + |
"</textarea>"; |
} |
} |
|
|
|
|
|
|
class Password |
|
{ |
inherit String; |
constant width = 20; |
constant type = "Password"; |
|
void set_from_form( RequestID id ) |
{ |
mapping val; |
if( sizeof( val = get_form_vars(id)) && |
val[""] && strlen(val[""]) ) |
set( crypt( val[""] ) ); |
} |
|
string render_view( RequestID id ) |
{ |
return "******"; |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
additional_args = additional_args || ([]); |
additional_args->type="password"; |
return input(path(), "", 30, additional_args); |
} |
} |
|
class File |
|
{ |
inherit String; |
constant type = "File"; |
constant width = 50; |
|
string read( ) |
|
{ |
return Stdio.read_bytes( query() ); |
} |
|
Stat stat() |
|
{ |
return file_stat( query() ); |
} |
|
#ifdef __NT__ |
array verify_set( string value ) |
{ |
return ::verify_set( replace( value, "\\", "/" ) ); |
} |
#endif |
|
} |
|
class Location |
|
{ |
inherit String; |
constant type = "Location"; |
constant width = 50; |
|
array verify_set( string value ) |
{ |
if( !strlen( value ) || !((<'~','/'>)[value[-1]]) ) |
return ({ |
LOCALE(330,"You most likely want an ending '/' on this variable"), |
value |
}); |
return ::verify_set( value ); |
} |
} |
|
class URL |
|
{ |
inherit String; |
constant type = "URL"; |
constant width = 50; |
|
array verify_set_from_form( string new_value ) |
{ |
return verify_port( new_value, 1 ); |
} |
} |
|
class Directory |
|
{ |
inherit String; |
constant type = "Directory"; |
constant width = 50; |
|
array verify_set( string value ) |
{ |
#ifdef __NT__ |
value = replace( value, "\\", "/" ); |
#endif |
if( strlen(value) && value[-1] != '/' ) |
value += "/"; |
if( !strlen( value ) ) |
return ::verify_set( value ); |
if( !(r_file_stat( value ) && (r_file_stat( value )[ ST_SIZE ] == -2 ))) |
return ({sprintf(LOCALE(331,"%s is not a directory"),value)+"\n",value}); |
return ::verify_set( value ); |
} |
|
Stat stat() |
|
{ |
return file_stat( query() ); |
} |
|
array get( ) |
|
{ |
return get_dir( query() ); |
} |
} |
|
|
|
|
|
|
|
class MultipleChoice |
|
{ |
inherit Variable; |
static array _list = ({}); |
static mapping _table = ([]); |
|
void set_choice_list( array to ) |
|
{ |
_list = to; |
} |
|
array get_choice_list( ) |
|
|
{ |
return _list; |
} |
|
void set_translation_table( mapping to ) |
|
{ |
_table = to; |
} |
|
mapping get_translation_table( ) |
|
|
{ |
return _table; |
} |
|
static string _name( mixed what ) |
|
|
{ |
return (string)what; |
} |
|
static string _title( mixed what ) |
|
|
{ |
if( mapping tt = get_translation_table() ) |
return tt[ what ] || (string)what; |
return (string)what; |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
string res = "<select name='"+path()+"'>\n"; |
string current = _name (query()); |
int selected = 0; |
foreach( get_choice_list(), mixed elem ) |
{ |
mapping m = ([]); |
m->value = _name( elem ); |
if( equal( m->value, current ) ) { |
m->selected="selected"; |
selected = 1; |
} |
res += " "+Roxen.make_container( "option", m, _title( elem ) )+"\n"; |
} |
if (!selected) |
|
|
|
res += " " + Roxen.make_container ( |
"option", (["value":_name(current), "selected": "selected"]), |
sprintf(LOCALE(332,"(keep stale value %s)"),_name(current))); |
return res + "</select>"; |
} |
static void create( mixed default_value, array|mapping choices, |
int _flags, LocaleString std_name, |
LocaleString std_doc ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
::create( default_value, _flags, std_name, std_doc ); |
if( mappingp( choices ) ) { |
set_translation_table( choices ); |
set_choice_list( indices(choices) ); |
} else |
set_choice_list( choices ); |
} |
} |
|
|
|
|
|
|
class StringChoice |
|
{ |
inherit MultipleChoice; |
constant type = "StringChoice"; |
} |
|
|
class IntChoice |
|
{ |
inherit MultipleChoice; |
constant type = "IntChoice"; |
int transform_from_form( string what ) |
{ |
return (int)what; |
} |
} |
|
class FloatChoice |
|
{ |
inherit MultipleChoice; |
constant type = "FloatChoice"; |
static int _prec = 3; |
|
void set_precision( int prec ) |
|
|
|
{ |
_prec = prec; |
} |
|
static string _title( mixed what ) |
{ |
if( !_prec ) |
return sprintf( "%d", (int)what ); |
return sprintf( "%1."+_prec+"f", what ); |
} |
|
int transform_from_form( string what ) |
{ |
array q = get_choice_list(); |
mapping a = mkmapping( map( q, _name ), q ); |
return a[what] || (float)what; |
} |
} |
|
class FontChoice |
|
{ |
inherit StringChoice; |
constant type = "FontChoice"; |
void set_choice_list() |
{ |
} |
array get_choice_list() |
{ |
return roxenp()->fonts->available_fonts(); |
} |
static void create(mixed default_value,int flags, |
LocaleString std_name,LocaleString std_doc) |
|
|
|
|
|
|
|
|
|
|
{ |
::create( default_value, 0, flags,std_name, std_doc ); |
} |
} |
|
|
|
|
|
class List |
|
{ |
inherit Variable; |
constant type="List"; |
constant width = 40; |
|
string transform_to_form( mixed what ) |
|
|
{ |
return (string)what; |
} |
|
mixed transform_from_form( string what ) |
{ |
return what; |
} |
|
static int _current_count = time()*100+(gethrtime()/10000); |
void set_from_form(RequestID id) |
{ |
int rn, do_goto; |
array l = query(); |
mapping vl = get_form_vars(id); |
|
if( (int)vl[".count"] != _current_count ) |
return; |
_current_count++; |
|
foreach( indices( vl ), string vv ) |
if( sscanf( vv, ".set.%d", rn ) ) |
{ |
m_delete( id->variables, path()+vv ); |
l[rn] = transform_from_form( vl[vv] ); |
m_delete( vl, vv ); |
} |
|
foreach( indices(vl), string vv ) |
if( sscanf( vv, ".up.%d.x%*s", rn ) == 2 ) |
{ |
do_goto = 1; |
m_delete( id->variables, path()+vv ); |
m_delete( vl, vv ); |
l = l[..rn-2] + l[rn..rn] + l[rn-1..rn-1] + l[rn+1..]; |
} |
else if( sscanf( vv, ".down.%d.x%*s", rn )==2 ) |
{ |
do_goto = 1; |
m_delete( id->variables, path()+vv ); |
l = l[..rn-1] + l[rn+1..rn+1] + l[rn..rn] + l[rn+2..]; |
} |
|
if( vl[".new.x"] ) |
{ |
do_goto = 1; |
m_delete( id->variables, path()+".new.x" ); |
l += ({ transform_from_form( "" ) }); |
} |
|
|
foreach( indices(vl), string vv ) |
if( sscanf( vv, ".delete.%d.x%*s", rn )==2 ) |
{ |
do_goto = 1; |
m_delete( id->variables, path()+vv ); |
l = l[..rn-1] + l[rn+1..]; |
} |
if( do_goto ) |
{ |
if( !id->misc->do_not_goto ) |
{ |
id->misc->moreheads = ([ |
"Location":Roxen.http_encode_string(id->raw_url+"?random="+ |
random(4949494)+ |
"§ion="+ |
id->variables->section+ |
"#"+path()), |
]); |
if( id->misc->defines ) |
id->misc->defines[ " _error" ] = 302; |
} |
} |
|
array b; |
mixed q = catch( b = verify_set_from_form( l ) ); |
if( q || sizeof( b ) != 2 ) |
{ |
if( q ) |
set_warning( q ); |
else |
set_warning( "Internal error: Illegal sized array " |
"from verify_set_from_form\n" ); |
return; |
} |
if( b ) |
{ |
set_warning( b[0] ); |
set( b[1] ); |
} |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
string prefix = path()+"."; |
int i; |
|
string res = "<a name='"+path()+"'>\n</a><table>\n" |
"<input type='hidden' name='"+prefix+"count' value='"+_current_count+"' />\n"; |
|
foreach( map(query(), transform_to_form), string val ) |
{ |
res += "<tr>\n<td><font size='-1'>"+ input( prefix+"set."+i, val, width) + "</font></td>\n"; |
#define BUTTON(X,Y) ("<submit-gbutton2 name='"+X+"'>"+Y+"</submit-gbutton2>") |
#define REORDER(X,Y) ("<submit-gbutton2 name='"+X+"' icon-src='"+Y+"'></submit-gbutton2>") |
if( i ) |
res += "\n<td>"+ |
REORDER(prefix+"up."+i, "/internal-roxen-up")+ |
"</td>"; |
else |
res += "\n<td></td>"; |
if( i != sizeof( query())- 1 ) |
res += "\n<td>"+ |
REORDER(prefix+"down."+i, "/internal-roxen-down") |
+"</td>"; |
else |
res += "\n<td></td>"; |
res += "\n<td>"+ |
BUTTON(prefix+"delete."+i, LOCALE(227, "Delete") ) |
+"</td>"; |
"</tr>"; |
i++; |
} |
res += |
"\n<tr><td colspan='2'>"+ |
BUTTON(prefix+"new", LOCALE(297, "New row") )+ |
"</td></tr></table>\n\n"; |
|
return res; |
} |
} |
|
|
|
|
|
class DirectoryList |
|
{ |
inherit List; |
constant type="DirectoryList"; |
|
array verify_set( array(string) value ) |
{ |
string warn = ""; |
foreach( value, string vi ) |
{ |
if(!strlen(vi)) |
continue; |
if( !(r_file_stat( vi ) && (r_file_stat( vi )[ ST_SIZE ] == -2 ))) |
warn += sprintf(LOCALE(331,"%s is not a directory"),vi)+"\n"; |
if( strlen(vi) && vi[-1] != '/' ) |
value = replace( value, vi, vi+"/" ); |
} |
#ifdef __NT__ |
value = map( value, replace, "\\", "/" ); |
#endif |
if( strlen( warn ) ) |
return ({ warn, value }); |
|
return ::verify_set( value ); |
} |
} |
|
class StringList |
|
{ |
inherit List; |
constant type="StringList"; |
} |
|
class IntList |
|
{ |
inherit List; |
constant type="IntList"; |
constant width=20; |
|
string transform_to_form(int what) { return (string)what; } |
int transform_from_form(string what) { return (int)what; } |
} |
|
class FloatList |
|
{ |
inherit List; |
constant type="DirectoryList"; |
constant width=20; |
|
static int _prec = 3; |
|
void set_precision( int prec ) |
|
|
|
{ |
_prec = prec; |
} |
|
string transform_to_form(int what) |
{ |
return sprintf("%1."+_prec+"f", what); |
} |
float transform_from_form(string what) { return (float)what; } |
} |
|
class URLList |
|
{ |
inherit List; |
constant type="URLList"; |
|
array verify_set_from_form( array(string) new_value ) |
{ |
string warn = ""; |
array res = ({}); |
foreach( new_value, string vv ) |
{ |
string tmp1, tmp2; |
[tmp1,tmp2] = verify_port( vv, 1 ); |
if( tmp1 ) |
warn += tmp1; |
res += ({ tmp2 }); |
} |
if( !strlen( warn ) ) |
warn = 0; |
return ({ warn, res }); |
} |
} |
|
class PortList |
|
{ |
inherit List; |
constant type="PortList"; |
|
array verify_set_from_form( array(string) new_value ) |
{ |
string warn = ""; |
array res = ({}); |
foreach( new_value, string vv ) |
{ |
string tmp1, tmp2; |
[tmp1,tmp2] = verify_port( vv, 0 ); |
if( tmp1 ) |
warn += tmp1; |
res += ({ tmp2 }); |
} |
if( !strlen( warn ) ) |
warn = ""; |
return ({ warn, res }); |
} |
} |
|
|
class FileList |
|
{ |
inherit List; |
constant type="FileList"; |
|
#ifdef __NT__ |
array verify_set( array(string) value ) |
{ |
return ::verify_set( map( value, replace, "\\", "/" ) ); |
} |
#endif |
} |
|
|
|
|
|
|
class Flag |
|
{ |
inherit Variable; |
constant type = "Flag"; |
|
int transform_from_form( string what ) |
{ |
return (int)what; |
} |
|
string render_form( RequestID id, void|mapping additional_args ) |
{ |
string res = "<select name=\""+path()+"\"> "; |
if(query()) |
res += "<option value=\"1\" selected=\"selected\">" + |
LOCALE("yes", "Yes")+ "</option>\n" |
"<option value=\"0\">" +LOCALE("no", "No")+ "</option>\n"; |
else |
res += "<option value=\"1\">" +LOCALE("yes", "Yes")+ "</option>\n" |
"<option value=\"0\" selected>" +LOCALE("no", "No")+ "</option>\n"; |
return res+"</select>"; |
} |
} |
|
|
|
|
|
|
|
static array(string) verify_port( string port, int nofhttp ) |
{ |
if(!strlen(port)) |
return ({ 0, port }); |
|
string warning=""; |
if( (int)port ) |
{ |
warning += sprintf(LOCALE(333,"Assuming http://*:%[0]d/ for %[0]d")+"\n", |
(int)port); |
port = "http://*:"+port+"/"; |
} |
string protocol, host, path; |
|
if(!strlen( port ) ) |
return ({ LOCALE(334,"Empty URL field")+"\n", port }); |
|
if(sscanf( port, "%[^:]://%[^/]%s", protocol, host, path ) != 3) |
return ({ sprintf(LOCALE(335,"%s does not conform to URL syntax")+"\n",port), |
port }); |
|
if( path == "" || path[-1] != '/' ) |
{ |
warning += sprintf(LOCALE(336,"Added / to the end of %s")+"\n",port); |
path += "/"; |
} |
if( nofhttp && protocol == "fhttp" ) |
{ |
warning += sprintf(LOCALE(337,"Changed %s to http")+"\n",protocol); |
protocol = "http"; |
} |
if( protocol != lower_case( protocol ) ) |
{ |
warning += sprintf(LOCALE(338,"Changed %s to %s"), |
protocol, lower_case( protocol ))+"\n"; |
protocol = lower_case( protocol ); |
} |
if(!nofhttp) |
{ |
#if constant(SSL.sslfile) |
|
#else |
if( (protocol == "https" || protocol == "ftps") ) |
warning += |
LOCALE(339,"SSL support not available in this Pike version.")+"\n"+ |
sprintf(LOCALE(340,"Please use %s instead."), |
protocol[..strlen(protocol)-2])+"\n"; |
#endif |
} |
int pno; |
if( sscanf( host, "%s:%d", host, pno ) == 2) |
if( roxenp()->protocols[ lower_case( protocol ) ] |
&& (pno == roxenp()->protocols[ lower_case( protocol ) ]->default_port )) |
warning += sprintf(LOCALE(341,"Removed the default port number " |
"(%d) from %s"),pno,port)+"\n"; |
else |
host = host+":"+pno; |
|
|
port = protocol+"://"+host+path; |
|
if( !roxenp()->protocols[ protocol ] ) |
warning += sprintf(LOCALE(342,"Warning: The protocol %s is not known " |
"by roxen"),protocol)+"\n"; |
return ({ (strlen(warning)?warning:0), port }); |
} |
|
string input(string name, string value, int size, |
void|mapping(string:string) args, void|int noxml) |
{ |
if(!args) |
args=([]); |
else |
args+=([]); |
|
args->name=name; |
if(value) |
args->value=value; |
if(!args->size && size) |
args->size=(string)size; |
|
string render="<input"; |
|
foreach(indices(args), string attr) { |
render+=" "+attr+"="; |
if(!has_value(args[attr], "\"")) render+="\""+args[attr]+"\""; |
else if(!has_value(args[attr], "'")) render+="'"+args[attr]+"'"; |
else render+="\""+replace(args[attr], "'", "'")+"\""; |
} |
|
if(noxml) return render+">"; |
return render+" />"; |
} |
|
|