diff --git a/daemon/HaikuDaemon.cpp b/daemon/HaikuDaemon.cpp index 8e20cd45..f4a31618 100644 --- a/daemon/HaikuDaemon.cpp +++ b/daemon/HaikuDaemon.cpp @@ -15,6 +15,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include #include @@ -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 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 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(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 -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;