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",
|
2024-08-16 17:56:42 +03:00
|
|
|
[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
|
|
|
}
|
|
|
|
|
2024-08-16 17:56:42 +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())
|
|
|
|
{
|
2024-08-16 17:56:42 +03:00
|
|
|
// Create new socket connection
|
|
|
|
socket_client = Gio::SocketClient::create();
|
|
|
|
|
|
|
|
socket_client->set_tls(
|
|
|
|
true
|
2024-08-16 10:00:23 +03:00
|
|
|
);
|
|
|
|
|
2024-08-16 17:56:42 +03:00
|
|
|
socket_client->set_tls_validation_flags(
|
|
|
|
Gio::TlsCertificateFlags::NO_FLAGS
|
|
|
|
);
|
2024-08-16 10:00:23 +03:00
|
|
|
|
2024-08-16 17:56:42 +03:00
|
|
|
socket_client->set_timeout(
|
|
|
|
15 // @TODO
|
|
|
|
);
|
2024-08-16 10:00:23 +03:00
|
|
|
|
|
|
|
socket_client->connect_to_host_async(
|
2024-08-16 17:56:42 +03:00
|
|
|
navbar->get_request_host(),
|
2024-08-16 18:59:22 +03:00
|
|
|
navbar->get_request_port().empty() ? 1965 : std::stoi(
|
2024-08-16 17:56:42 +03:00
|
|
|
navbar->get_request_port()
|
|
|
|
),
|
2024-08-16 10:00:23 +03:00
|
|
|
[this](const Glib::RefPtr<Gio::AsyncResult> & result)
|
|
|
|
{
|
2024-08-16 17:56:42 +03:00
|
|
|
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";
|
2024-08-16 17:56:42 +03:00
|
|
|
|
|
|
|
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
|
2024-08-16 17:56:42 +03:00
|
|
|
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",
|
2024-08-16 17:56:42 +03:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2024-08-16 17:56:42 +03:00
|
|
|
socket_connection->close();
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
);
|
2024-08-16 10:00:23 +03:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-08-17 10:27:17 +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://";
|
2024-08-17 10:27:17 +03:00
|
|
|
|
|
|
|
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();
|
2024-08-17 10:27:17 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
request += navbar->get_request_path();
|
|
|
|
|
|
|
|
if (!navbar->get_request_query().empty())
|
|
|
|
{
|
|
|
|
request += "?" + navbar->get_request_query();
|
|
|
|
}
|
|
|
|
|
|
|
|
navbar->set_request(
|
|
|
|
request
|
|
|
|
);
|
|
|
|
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2024-08-16 17:56:42 +03:00
|
|
|
else
|
2024-08-16 10:00:23 +03:00
|
|
|
{
|
2024-08-17 10:27:17 +03:00
|
|
|
// @TODO search request
|
2024-08-16 10:00:23 +03:00
|
|
|
}
|
|
|
|
}
|