1
0
mirror of https://github.com/YGGverse/Yoda.git synced 2025-03-13 06:01:21 +00:00

171 lines
4.4 KiB
C++
Raw Normal View History

2024-08-15 18:52:11 +03:00
#include "page.hpp"
#include "page/navbar.hpp"
#include "page/content.hpp"
2024-08-13 08:07:56 +03:00
using namespace app::browser::main::tab;
2024-08-15 18:52:11 +03:00
Page::Page()
2024-08-13 08:07:56 +03:00
{
2024-08-13 08:48:17 +03:00
// Init container
2024-08-13 08:07:56 +03:00
set_orientation(
Gtk::Orientation::VERTICAL
);
2024-08-14 07:56:34 +03:00
// Init actions group
action_group = Gio::SimpleActionGroup::create();
2024-08-14 09:16:45 +03:00
// Define group actions
action_group->add_action(
"update",
[this]
{
Page::update();
}
2024-08-14 09:16:45 +03:00
);
2024-08-14 07:56:34 +03:00
insert_action_group(
2024-08-15 18:52:11 +03:00
"page",
2024-08-14 07:56:34 +03:00
action_group
);
2024-08-14 14:59:36 +03:00
// Init components
2024-08-15 18:52:11 +03:00
navbar = new page::Navbar();
2024-08-14 14:59:36 +03:00
append(
* navbar
);
// Refresh children elements view (e.g. buttons sensitivity)
// because of insert_action_group + append here @TODO
navbar->refresh();
2024-08-15 18:52:11 +03:00
content = new page::Content();
2024-08-14 14:59:36 +03:00
append(
* content
);
2024-08-13 08:07:56 +03:00
}
Page::~Page()
{
delete navbar;
delete content;
}
2024-08-14 07:56:34 +03:00
2024-08-15 18:52:11 +03:00
void Page::update()
2024-08-14 09:16:45 +03:00
{
2024-08-16 10:00:23 +03:00
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
2024-08-16 10:00:23 +03:00
);
socket_client->set_tls_validation_flags(
Gio::TlsCertificateFlags::NO_FLAGS
);
2024-08-16 10:00:23 +03:00
socket_client->set_timeout(
15 // @TODO
);
2024-08-16 10:00:23 +03:00
socket_client->connect_to_host_async(
navbar->get_request_host(),
2024-08-16 18:59:22 +03:00
navbar->get_request_port().empty() ? 1965 : std::stoi(
navbar->get_request_port()
),
2024-08-16 10:00:23 +03:00
[this](const Glib::RefPtr<Gio::AsyncResult> & result)
{
socket_connection = socket_client->connect_to_host_finish(
result
);
// Request
2024-08-17 12:45:43 +03:00
const Glib::ustring request = navbar->get_request() + "\r\n";
socket_connection->get_output_stream()->write_async(
request.data(),
request.size(),
[this](const Glib::RefPtr<Gio::AsyncResult> & result)
{
// Response
2024-08-18 15:19:36 +03:00
socket_connection->get_input_stream()->read_async( // | read_all_async
buffer,
sizeof(buffer) - 1,
[this](const Glib::RefPtr<Gio::AsyncResult> & result)
{
2024-08-18 15:19:36 +03:00
// Parse meta
auto meta = Glib::Regex::split_simple(
R"regex(^(\d+)?\s([\w]+\/[\w]+)?)regex",
buffer
);
2024-08-18 15:19:36 +03:00
// 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();
}
);
}
);
2024-08-16 10:00:23 +03:00
}
);
}
// Scheme not found but host provided, redirect to gemini://
else if (!navbar->get_request_host().empty())
{
2024-08-17 12:45:43 +03:00
Glib::ustring request = "gemini://";
request += navbar->get_request_host(); // @TODO validate
if (!navbar->get_request_port().empty())
{
2024-08-17 12:45:43 +03:00
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
2024-08-16 10:00:23 +03:00
{
// @TODO search request
2024-08-16 10:00:23 +03:00
}
}