add closing dialogs, redirecting and removing content functionality to the winix framework

add such new methods to FunctionBase:
- bool can_push_url_to_browser_history();
- void add_standard_models();
- void close_modal_dialogs();

- void prepare_doc_url(const wchar_t * local_url, pt::WTextStream & url);
- void prepare_doc_url(const wchar_t * local_url, std::wstring & url);
- std::wstring prepare_doc_url(const wchar_t * local_url = nullptr);
- std::wstring prepare_doc_url(const std::wstring & local_url);

- void redirect_to(const wchar_t * url, bool append_domain = true);
- void redirect_to(const std::wstring & url, bool append_domain = true);
- void redirect_to(const pt::WTextStream & url, bool append_domain = true);

- void redirect_to(const wchar_t * url, const wchar_t * frame_url, const wchar_t * dom_target);
- void redirect_to(const std::wstring & url, const std::wstring & frame_url, const std::wstring & dom_target);
- void redirect_to(pt::WTextStream & url, pt::WTextStream & frame_url, pt::WTextStream & dom_target);
- void redirect_to(pt::WTextStream & url, pt::WTextStream & frame_url, const wchar_t * dom_target);
- void redirect_to(const wchar_t * url, const wchar_t * frame_url, pt::WTextStream & dom_target);

- void retarged(const wchar_t * frame, const wchar_t * dom_target, const wchar_t * push_url = nullptr, const wchar_t * swap_algorithm = nullptr);
- void retarged(const std::wstring & frame, const std::wstring & dom_target, const std::wstring & push_url, const wchar_t * swap_algorithm = nullptr);
- void retarged(const wchar_t * frame, pt::WTextStream & dom_target, const wchar_t * push_url = nullptr, const wchar_t * swap_algorithm = nullptr);

- void remove_content(pt::WTextStream & dom_target, bool close_dialogs = false);
- void remove_content(const wchar_t * dom_target, bool has_postfix, long dom_target_postfix, bool close_dialogs = false);
- void remove_content(const wchar_t * dom_target, long dom_target_postfix, bool close_dialogs = false);
- void remove_content(const wchar_t * dom_target, bool close_dialogs = false);

- void update_content(const wchar_t * frame, pt::WTextStream & dom_target, bool close_dialogs = false);
- void update_content(const wchar_t * frame, const wchar_t * dom_target, bool has_postfix, long dom_target_postfix, bool close_dialogs = false);
- void update_content(const wchar_t * frame, const wchar_t * dom_target, long dom_target_postfix, bool close_dialogs = false);
- void update_content(const wchar_t * frame, const wchar_t * dom_target, bool close_dialogs = false);

while here:
- refactor PascalCase to snake_case in FunctionBase
- add start_request() and finish_request() methods to FunctionBase
- add has_*_access() methods to FunctionBase
- fix: FunctionBase::clear() method was not called if a request was assigned to a job
- add a WinixEzcHelper model
- allow to serialize a header if the header value is neither a string nor an integer
- refactor PascalCase to snake_case in functions: Emacs, Mkdir, Upload
This commit is contained in:
2024-06-27 10:57:08 +02:00
parent 6aa100f12c
commit c30b7db041
129 changed files with 4064 additions and 3199 deletions

View File

@@ -184,8 +184,8 @@ void Functions::SetObjects(FunctionBase * fun)
//fun->SetConfig(config);
//fun->SetCur(cur);
//fun->SetSystem(system);
fun->SetFunctions(this);
fun->SetTemplates(templates);
fun->set_functions(this);
fun->set_templates(templates);
//fun->SetSynchro(synchro);
//fun->SetSessionManager(session_manager);
}
@@ -288,7 +288,7 @@ void Functions::InitFunctions()
Table::iterator i = table.begin();
for( ; i!=table.end() ; ++i)
i->second->Init();
i->second->init();
}
@@ -297,7 +297,7 @@ void Functions::FinishFunctions()
Table::iterator i = table.begin();
for( ; i!=table.end() ; ++i)
i->second->Finish();
i->second->finish();
}
@@ -449,19 +449,181 @@ bool was_default_function = false;
}
bool Functions::HasAccessToCallMake()
{
bool has_access = false;
if( cur->request->method == Request::get )
{
has_access = cur->request->function->has_get_access();
}
else
if( cur->request->method == Request::head )
{
has_access = cur->request->function->has_head_access();
}
else
if( cur->request->method == Request::post )
{
has_access = cur->request->function->has_post_access();
}
else
if( cur->request->method == Request::put )
{
has_access = cur->request->function->has_put_access();
}
else
if( cur->request->method == Request::delete_ )
{
has_access = cur->request->function->has_delete_access();
}
else
if( cur->request->method == Request::connect )
{
has_access = cur->request->function->has_connect_access();
}
else
if( cur->request->method == Request::options )
{
has_access = cur->request->function->has_options_access();
}
else
if( cur->request->method == Request::trace )
{
has_access = cur->request->function->has_trace_access();
}
else
if( cur->request->method == Request::patch )
{
has_access = cur->request->function->has_patch_access();
}
else
{
log << log2 << "Functions: I cannot call a function, an unknown request method (skipping)" << logend;
}
return has_access;
}
void Functions::CallFunctionMake()
{
if( cur->request->method == Request::get )
{
cur->request->function->make_get();
}
else
if( cur->request->method == Request::head )
{
cur->request->function->make_head();
}
else
if( cur->request->method == Request::post )
{
cur->request->function->make_post();
}
else
if( cur->request->method == Request::put )
{
cur->request->function->make_put();
}
else
if( cur->request->method == Request::delete_ )
{
cur->request->function->make_delete();
}
else
if( cur->request->method == Request::connect )
{
cur->request->function->make_connect();
}
else
if( cur->request->method == Request::options )
{
cur->request->function->make_options();
}
else
if( cur->request->method == Request::trace )
{
cur->request->function->make_trace();
}
else
if( cur->request->method == Request::patch )
{
cur->request->function->make_patch();
}
else
{
log << log2 << "Functions: I cannot call a function, an unknown request method (skipping)" << logend;
}
}
void Functions::CallFunctionContinueMake()
{
if( cur->request->method == Request::get )
{
cur->request->function->continue_make_get();
}
else
if( cur->request->method == Request::head )
{
cur->request->function->continue_make_head();
}
else
if( cur->request->method == Request::post )
{
cur->request->function->continue_make_post();
}
else
if( cur->request->method == Request::put )
{
cur->request->function->continue_make_put();
}
else
if( cur->request->method == Request::delete_ )
{
cur->request->function->continue_make_delete();
}
else
if( cur->request->method == Request::connect )
{
cur->request->function->continue_make_connect();
}
else
if( cur->request->method == Request::options )
{
cur->request->function->continue_make_options();
}
else
if( cur->request->method == Request::trace )
{
cur->request->function->continue_make_trace();
}
else
if( cur->request->method == Request::patch )
{
cur->request->function->continue_make_patch();
}
else
{
log << log2 << "Functions: I cannot continue a request, an unknown request method (skipping)" << logend;
}
}
void Functions::MakeFunction()
{
if( !cur->request->function )
{
cur->request->http_status = Header::status_500_internal_server_error; // or 404? (404 was originally)
log << log1 << "Functions: no function to call" << logend;
log << log2 << "Functions: no function to call" << logend;
return;
}
if( !system->DirsHaveReadExecPerm() ||
!system->HasReadExecAccess(cur->request->function->fun) ||
!cur->request->function->HasAccess() )
!HasAccessToCallMake() )
{
cur->request->http_status = Header::status_403_forbidden;
return;
@@ -473,54 +635,11 @@ void Functions::MakeFunction()
return;
}
if( cur->request->method == Request::get )
{
cur->request->function->MakeGet();
}
else
if( cur->request->method == Request::head )
{
cur->request->function->MakeHead();
}
else
if( cur->request->method == Request::post )
{
cur->request->function->MakePost();
}
else
if( cur->request->method == Request::put )
{
cur->request->function->MakePut();
}
else
if( cur->request->method == Request::delete_ )
{
cur->request->function->MakeDelete();
}
else
if( cur->request->method == Request::connect )
{
cur->request->function->MakeConnect();
}
else
if( cur->request->method == Request::options )
{
cur->request->function->MakeOptions();
}
else
if( cur->request->method == Request::trace )
{
cur->request->function->MakeTrace();
}
else
if( cur->request->method == Request::patch )
{
cur->request->function->MakePatch();
}
else
{
log << log1 << "Functions: I cannot call a function, an unknown request method (skipping)" << logend;
}
cur->request->function->start_request();
CallFunctionMake();
if( cur->request->run_state != Request::RunState::assigned_to_job )
cur->request->function->finish_request();
}
@@ -535,7 +654,7 @@ void Functions::ContinueMakeFunction()
if( !system->DirsHaveReadExecPerm() ||
!system->HasReadExecAccess(cur->request->function->fun) ||
!cur->request->function->HasAccess() )
!HasAccessToCallMake() )
{
cur->request->http_status = Header::status_403_forbidden;
return;
@@ -545,54 +664,10 @@ void Functions::ContinueMakeFunction()
cur->request->PutMethodName(log);
log << " for request " << cur->request << " for function " << cur->request->function->fun.url << logend;
if( cur->request->method == Request::get )
{
cur->request->function->ContinueMakeGet();
}
else
if( cur->request->method == Request::head )
{
cur->request->function->ContinueMakeHead();
}
else
if( cur->request->method == Request::post )
{
cur->request->function->ContinueMakePost();
}
else
if( cur->request->method == Request::put )
{
cur->request->function->ContinueMakePut();
}
else
if( cur->request->method == Request::delete_ )
{
cur->request->function->ContinueMakeDelete();
}
else
if( cur->request->method == Request::connect )
{
cur->request->function->ContinueMakeConnect();
}
else
if( cur->request->method == Request::options )
{
cur->request->function->ContinueMakeOptions();
}
else
if( cur->request->method == Request::trace )
{
cur->request->function->ContinueMakeTrace();
}
else
if( cur->request->method == Request::patch )
{
cur->request->function->ContinueMakePatch();
}
else
{
log << log1 << "Functions: I cannot continue a request, an unknown request method (skipping)" << logend;
}
CallFunctionContinueMake();
if( cur->request->run_state != Request::RunState::assigned_to_job )
cur->request->function->finish_request();
}