2022-06-25 01:55:54 +02:00
# ifndef WEB_NODE_H
# define WEB_NODE_H
2022-06-27 01:03:01 +02:00
# include "core/hash_map.h"
2022-07-01 18:50:56 +02:00
# include "core/os/rw_lock.h"
2022-06-25 01:55:54 +02:00
# include "core/reference.h"
# include "core/variant.h"
2022-06-27 01:03:01 +02:00
# include "scene/main/node.h"
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
class WebServerRequest ;
# if WEB_SETTINGS_ENABLED
2022-06-25 01:55:54 +02:00
class Settings ;
2022-06-27 01:03:01 +02:00
# endif
2022-06-25 01:55:54 +02:00
class WebServer ;
class WebPermission ;
# ifdef DATABASES_ENABLED
class DataBase ;
class TableBuilder ;
class QueryBuilder ;
# endif
2022-06-27 01:03:01 +02:00
//note add an alterative queue_delete() -> (with different name) -> if called node tells parent to stop getting routed to, and when rwlock can be locked gets queue_deleted.
2022-06-27 16:37:30 +02:00
//Also add an rwlock just around the handler map (if it's not done already), and add api to lock and unlock it
2022-06-26 21:34:29 +02:00
2022-06-25 01:55:54 +02:00
class WebNode : public Node {
2022-06-27 01:03:01 +02:00
GDCLASS ( WebNode , Node ) ;
2022-06-25 01:55:54 +02:00
public :
2022-06-26 21:34:29 +02:00
enum {
2022-06-27 01:03:01 +02:00
NOTIFICATION_WEB_TREE_WRITE_LOCKED = 2000 ,
2022-06-26 21:34:29 +02:00
} ;
2022-06-25 01:55:54 +02:00
String get_uri_segment ( ) ;
void set_uri_segment ( const String & val ) ;
2022-06-27 01:03:01 +02:00
String get_full_uri ( const bool slash_at_the_end = true ) ;
String get_full_uri_parent ( const bool slash_at_the_end = true ) ;
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
//Maybe this settings class could be a resource, also it needs a new name
# if WEB_SETTINGS_ENABLED
2022-06-25 01:55:54 +02:00
Settings * get_settings ( ) ;
void set_settings ( Settings * settings ) ;
2022-06-27 01:03:01 +02:00
# endif
2022-06-25 01:55:54 +02:00
Ref < WebPermission > get_web_permission ( ) ;
void set_web_permission ( const Ref < WebPermission > & wp ) ;
2022-06-27 01:03:01 +02:00
bool get_routing_enabled ( ) ;
void set_routing_enabled ( const bool value ) ;
2022-06-25 01:55:54 +02:00
# ifdef DATABASES_ENABLED
Database * get_database ( ) ;
Ref < TableBuilder > get_table_builder ( ) ;
Ref < QueryBuilder > get_query_builder ( ) ;
void set_database ( Database * db ) ;
# endif
2022-06-27 01:03:01 +02:00
void handle_request_main ( Ref < WebServerRequest > request ) ;
virtual void _handle_request_main ( Ref < WebServerRequest > request ) ;
void handle_request ( Ref < WebServerRequest > request ) ;
virtual void _handle_request ( Ref < WebServerRequest > request ) ;
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
void handle_error_send_request ( Ref < WebServerRequest > request , const int error_code ) ;
virtual void _handle_error_send_request ( Ref < WebServerRequest > request , const int error_code ) ;
2022-06-26 21:34:29 +02:00
2022-06-27 01:03:01 +02:00
void render_index ( Ref < WebServerRequest > request ) ;
void render_preview ( Ref < WebServerRequest > request ) ;
void render_menu ( Ref < WebServerRequest > request ) ;
void render_main_menu ( Ref < WebServerRequest > request ) ;
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
virtual void _render_index ( Ref < WebServerRequest > request ) ;
virtual void _render_preview ( Ref < WebServerRequest > request ) ;
virtual void _render_menu ( Ref < WebServerRequest > request ) ;
virtual void _render_main_menu ( Ref < WebServerRequest > request ) ;
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
void create_table ( ) ;
void drop_table ( ) ;
void udpate_table ( ) ;
void create_default_entries ( ) ;
2022-06-25 01:55:54 +02:00
2022-06-27 01:03:01 +02:00
virtual void _create_table ( ) ;
virtual void _drop_table ( ) ;
virtual void _udpate_table ( ) ;
virtual void _create_default_entries ( ) ;
void migrate ( const bool clear , const bool seed ) ;
2022-06-25 01:55:54 +02:00
virtual void _migrate ( const bool clear , const bool seed ) ;
2022-06-27 01:03:01 +02:00
bool try_route_request_to_children ( Ref < WebServerRequest > request ) ;
WebNode * get_request_handler_child ( Ref < WebServerRequest > request ) ;
2022-06-25 01:55:54 +02:00
void build_handler_map ( ) ;
void clear_handlers ( ) ;
2022-06-27 01:03:01 +02:00
void request_write_lock ( ) ;
2022-06-25 01:55:54 +02:00
WebServer * get_server ( ) ;
2022-06-27 01:03:01 +02:00
WebNode * get_web_root ( ) ;
2022-06-25 01:55:54 +02:00
WebNode * get_parent_webnode ( ) ;
2022-06-27 01:03:01 +02:00
void add_child_notify ( Node * p_child ) ;
void remove_child_notify ( Node * p_child ) ;
2022-06-25 01:55:54 +02:00
WebNode ( ) ;
~ WebNode ( ) ;
protected :
2022-06-27 01:03:01 +02:00
void _notification ( const int what ) ;
static void _bind_methods ( ) ;
2022-06-25 01:55:54 +02:00
String _uri_segment ;
2022-06-27 01:03:01 +02:00
# if WEB_SETTINGS_ENABLED
2022-06-25 01:55:54 +02:00
Settings * _settings ;
2022-06-27 01:03:01 +02:00
# endif
2022-06-25 01:55:54 +02:00
# ifdef DATABASES_ENABLED
Database * _database ;
# endif
bool _routing_enabled ;
WebNode * _index_node ;
2022-06-27 01:03:01 +02:00
HashMap < String , WebNode * > _node_route_map ;
2022-07-01 18:50:56 +02:00
RWLock _handler_map_lock ;
2022-06-25 01:55:54 +02:00
Ref < WebPermission > _web_permission ;
2022-06-27 01:03:01 +02:00
2022-06-27 14:59:09 +02:00
//TODO this should be atomic
2022-06-27 01:03:01 +02:00
bool _write_lock_requested ;
RWLock _rw_lock ;
2022-06-25 01:55:54 +02:00
} ;
2022-06-26 21:34:29 +02:00
# endif