#include "page.hpp" #include "page/navbar.hpp" #include "page/content.hpp" using namespace app::browser::main::tab; Page::Page() { // Init container set_orientation( Gtk::Orientation::VERTICAL ); // Init actions group action_group = Gio::SimpleActionGroup::create(); // Define group actions action_group->add_action( "update", [this] { Page::update(); } ); insert_action_group( "page", action_group ); // Init components navbar = new page::Navbar(); append( * navbar ); // Refresh children elements view (e.g. buttons sensitivity) // because of insert_action_group + append here @TODO navbar->refresh(); content = new page::Content(); append( * content ); } Page::~Page() { delete navbar; delete content; } void Page::update() { if ("file" == navbar->get_request_scheme()) { // @TODO } else if ("gemini" == navbar->get_request_scheme()) { // Create new socket connection socket_client = Gio::SocketClient::create(); socket_client->set_tls( true ); socket_client->set_tls_validation_flags( Gio::TlsCertificateFlags::NO_FLAGS ); socket_client->set_timeout( 15 // @TODO ); socket_client->connect_to_host_async( navbar->get_request_host(), navbar->get_request_port().empty() ? 1965 : std::stoi( navbar->get_request_port() ), [this](const Glib::RefPtr & result) { socket_connection = socket_client->connect_to_host_finish( result ); // Request const Glib::ustring request = navbar->get_request() + "\r\n"; socket_connection->get_output_stream()->write_async( request.data(), request.size(), [this](const Glib::RefPtr & result) { // Response socket_connection->get_input_stream()->read_async( // | read_all_async buffer, sizeof(buffer) - 1, [this](const Glib::RefPtr & result) { // Parse meta auto meta = Glib::Regex::split_simple( R"regex(^(\d+)?\s([\w]+\/[\w]+)?)regex", buffer ); // Route by status code if (meta[1] == "20") { // Route by mime type if (meta[2] == "text/gemini") { content->text_gemini( buffer // @TODO ); } else { // @TODO exception } } else { // @TODO exception } socket_connection->close(); } ); } ); } ); } // Scheme not found but host provided, redirect to gemini:// else if (!navbar->get_request_host().empty()) { Glib::ustring request = "gemini://"; request += navbar->get_request_host(); // @TODO validate if (!navbar->get_request_port().empty()) { request += navbar->get_request_port(); } request += navbar->get_request_path(); if (!navbar->get_request_query().empty()) { request += "?" + navbar->get_request_query(); } navbar->set_request( request ); update(); } else { // @TODO search request } }