Merge pull request #2414 from wipedlifepotato/openssl

Haiku OS tunnel info
This commit is contained in:
orignal
2026-06-20 14:18:50 -04:00
committed by GitHub
+127 -15
View File
@@ -15,6 +15,11 @@
#include <StringView.h>
#include <Font.h>
#include <MessageRunner.h>
#include<StringItem.h>
#include<ListView.h>
#include<TabView.h>
#include<ScrollView.h>
#include<Button.h>
#include <Window.h>
#include <Application.h>
#include <Alert.h>
@@ -29,7 +34,6 @@
#include "Transports.h"
#include "Daemon.h"
#include "ClientContext.h"
enum
{
M_GRACEFUL_SHUTDOWN = 1,
@@ -38,7 +42,9 @@ enum
C_GRACEFUL_SHUTDOWN_UPDATE,
C_MAIN_VIEW_UPDATE,
M_SHOW_TUNNEL,
C_OPENHTTP
C_OPENHTTP,
M_SHOWMAIN,
M_CLOSETUNNEL
};
constexpr bigtime_t GRACEFUL_SHUTDOWN_UPDATE_INTERVAL = 1000*1100; // in microseconds, ~ 1 sec
constexpr int GRACEFUL_SHUTDOWN_UPDATE_COUNT = 600; // 10 minutes
@@ -55,12 +61,16 @@ class MainWindow: public BWindow
void GetInfoAboutTunnel(BMessage * msg);
void UpdateMainView ();
void OpenHTTPInterface(void);
template <class T> void DrawTunnel(T tun);
void DrawTunnel(std::stringstream & s);
size_t m_counter_streams = 0;
private:
BMessenger m_Messenger;
BTabView * m_tab_view;
BStringView * m_MainView;
std::unique_ptr<BMessageRunner> m_MainViewUpdateTimer, m_GracefulShutdownTimer;
bool m_IsGracefulShutdownComplete = false;
bool m_IsDrawTunnel = false;
i2p::data::IdentHash m_IdentHash;
};
class I2PApp: public BApplication
@@ -81,6 +91,7 @@ MainWindow::MainWindow ():
auto runMenu = new BMenu ("Run");
runMenu->AddItem (new BMenuItem ("Open web interface", new BMessage(C_OPENHTTP)));
runMenu->AddItem (new BMenuItem ("Graceful shutdown", new BMessage (M_GRACEFUL_SHUTDOWN), 'G'));
runMenu->AddItem (new BMenuItem ("Show Main page", new BMessage (M_SHOWMAIN), 'M'));
runMenu->AddItem (new BMenuItem ("Quit", new BMessage (B_QUIT_REQUESTED), 'Q'));
menuBar->AddItem (runMenu);
auto commandsMenu = new BMenu ("Commands");
@@ -102,28 +113,104 @@ MainWindow::MainWindow ():
tunnelsMenu->AddItem (new BMenuItem (it.second->GetName (), msg));
}
menuBar->AddItem (tunnelsMenu);
m_MainView = new BStringView (BRect (20, 21, 300, 250), nullptr, "Starting...", B_FOLLOW_ALL, B_WILL_DRAW);
m_tab_view = new BTabView(Bounds().OffsetByCopy(0, 20), "tabview");
AddChild(m_tab_view);
BRect tabRect = m_tab_view->ContainerView()->Bounds();
auto bview = new BView(tabRect, "main_tab", B_FOLLOW_ALL, B_WILL_DRAW);
bview->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
m_MainView = new BStringView(BRect(10, 10, tabRect.right - 10, tabRect.bottom - 10),"info_view", "Starting...", B_FOLLOW_ALL);
bview->AddChild(m_MainView);
m_tab_view->AddTab(bview);
m_tab_view->TabAt(m_counter_streams)->SetLabel("Info");
m_MainView->SetViewColor (255, 255, 255);
m_MainView->SetHighColor (0xD4, 0x3B, 0x69);
BFont font = *be_plain_font;
font.SetSize (12);
m_MainView->SetFont (&font);
AddChild (m_MainView);
m_MainViewUpdateTimer = std::make_unique<BMessageRunner>(m_Messenger,
BMessage (C_MAIN_VIEW_UPDATE), MAIN_VIEW_UPDATE_INTERVAL);
}
}
void MainWindow::UpdateMainView ()
{
std::stringstream s;
i2p::util::PrintMainWindowText (s);
if(!m_IsDrawTunnel)
{
i2p::util::PrintMainWindowText (s);
}
else
{
DrawTunnel(s);
}
////std::cout << s.str() << std::endl;
m_MainView->SetText (s.str ().c_str ());
}
template <class T>
void MainWindow :: DrawTunnel(T tun) // idk about type, so todo: change to normal type
/*
* Логика - создать вектор с streamID + vector dest.
* не перерисовывать каждый раз а лишь добавлять которых нет
* и удалять те которые есть
* кнопка close работает
* */
void MainWindow :: DrawTunnel(std::stringstream & s)
{
m_MainView->SetText( i2p::client::context.GetAddressBook().ToAddress(tun).c_str() );
s << "\n";
s << "I2P Address: " << i2p::client::context.GetAddressBook().ToAddress(m_IdentHash) << ".b32.i2p\r\n";
auto dest = i2p::client::context.FindLocalDestination (m_IdentHash);
while(m_tab_view->CountTabs() > 1)
{
m_tab_view->RemoveTab(m_tab_view->CountTabs() - 1);
}
m_counter_streams = 0;
//std::cout << "Draw List View" << std::endl;;
if(!dest)
{
s << "Can't found local dest\r\n";
}
else
{
s << "Streams: \n";
for (auto stream : dest->GetAllStreams())
{
std::stringstream s1;
auto streamDest = i2p::client::context.GetAddressBook().ToAddress(stream->GetRemoteIdentity());
std::string streamDestShort = streamDest.substr(0,12) + ".b32.i2p";
s1 << streamDestShort << "|out|" << stream->GetNumSentBytes() << "|in:" << stream->GetNumReceivedBytes() <<"|";
BRect tabRect = m_tab_view->ContainerView()->Bounds();
auto bview = new BView(tabRect, streamDestShort.c_str(), B_FOLLOW_ALL, B_WILL_DRAW);
bview->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
auto tunnel_view = new BStringView(BRect(0, 0, tabRect.right - 100, tabRect.bottom - 100),"tunnel_view", "tunnel_view...", B_FOLLOW_ALL);
tunnel_view->SetText (s1.str ().c_str ());
BRect btnRect{10,10,90,35};//10+32,10+12);
auto msg = new BMessage(M_CLOSETUNNEL);
msg->AddUInt32("tunnel_val", stream->GetRecvStreamID());
BButton * closeButton = new BButton(
btnRect,"close leaseset", "close", msg
);
bview->AddChild(closeButton);
bview->AddChild(tunnel_view);
m_tab_view->AddTab(bview);
m_tab_view->TabAt(++m_counter_streams)->SetLabel(streamDestShort.c_str());
/*
* void ShowLocalDestination in daemon/HTTPServer.cpp
*/
s << s1.str() << "\n";
}
//s << "\r\n";
}
}
void MainWindow :: GetInfoAboutTunnel(BMessage * msg)
@@ -140,7 +227,9 @@ void MainWindow :: GetInfoAboutTunnel(BMessage * msg)
if( BString(it.second->GetName()) == name )
{
auto & ident = it.second->GetLocalDestination()->GetIdentHash();
return DrawTunnel(ident);
m_IdentHash = ident;
m_IsDrawTunnel = true;
return UpdateMainView();
//TODO:
}
}
@@ -150,7 +239,9 @@ void MainWindow :: GetInfoAboutTunnel(BMessage * msg)
if( BString(it.second->GetName()) == name)
{
auto & ident = it.second->GetLocalDestination()->GetIdentHash();
return DrawTunnel(ident);
m_IdentHash = ident;
m_IsDrawTunnel = true;
return UpdateMainView();
//TODO:
}
}
@@ -167,7 +258,7 @@ void MainWindow :: OpenHTTPInterface()
return m_MainView->SetText("Not enabled http server");
}
std::ostringstream com;
com << "WebPositive http://" << address << ":" << port;
com << "/bin/open 'http://" << address << ":" << port<<"'";
//char * argv[] = {(char*)url.str().c_str() , NULL, NULL};
//BRoster{}.Launch( "application/x-vnd.Haiku-WebPositive", 2, argv);
std::string com_s{com.str()};
@@ -178,10 +269,31 @@ void MainWindow :: OpenHTTPInterface()
void MainWindow::MessageReceived (BMessage * msg)
{
if (!msg) return;
uint32_t tunnel_val;// streamID (to method)
switch (msg->what)
{
// to method
case M_CLOSETUNNEL:
//std::cout << "Close Tunnel (DEBUG NOT WORKS)" << std::endl;
msg->FindUInt32("tunnel_val", &tunnel_val);
if(tunnel_val)
{
auto dest =
i2p::client::context.FindLocalDestination
(m_IdentHash);
if(dest)
{
dest->DeleteStream(tunnel_val);
}
}
break;
case M_SHOWMAIN:
m_IsDrawTunnel = false;
m_IdentHash = {};
UpdateMainView();
break;
case C_MAIN_VIEW_UPDATE:
UpdateMainView ();
break;