diff --git a/BOB.cpp b/BOB.cpp index c08ddbfb..dae601e5 100644 --- a/BOB.cpp +++ b/BOB.cpp @@ -265,7 +265,19 @@ namespace client else SendReplyError ("failed to create tunnel"); } - + + void BOBCommandSession::StopCommandHandler (const char * operand, size_t len) + { + auto tunnel = m_Owner.FindTunnel (m_Nickname); + if (tunnel) + { + tunnel->Stop (); + SendReplyOK ("tunnel stopping"); + } + else + SendReplyError ("tunnel not found"); + } + void BOBCommandSession::SetNickCommandHandler (const char * operand, size_t len) { LogPrint (eLogDebug, "BOB: setnick"); @@ -275,6 +287,20 @@ namespace client SendReplyOK (msg.c_str ()); } + void BOBCommandSession::GetNickCommandHandler (const char * operand, size_t len) + { + LogPrint (eLogDebug, "BOB: getnick"); + if (m_Owner.FindTunnel (operand)) + { + m_Nickname = operand; + std::string msg ("Nickname set to"); + msg += operand; + SendReplyOK (msg.c_str ()); + } + else + SendReplyError ("tunnel not found"); + } + void BOBCommandSession::NewkeysCommandHandler (const char * operand, size_t len) { LogPrint (eLogDebug, "BOB: newkeys"); @@ -322,7 +348,9 @@ namespace client m_CommandHandlers[BOB_COMMAND_ZAP] = &BOBCommandSession::ZapCommandHandler; m_CommandHandlers[BOB_COMMAND_QUIT] = &BOBCommandSession::QuitCommandHandler; m_CommandHandlers[BOB_COMMAND_START] = &BOBCommandSession::StartCommandHandler; + m_CommandHandlers[BOB_COMMAND_STOP] = &BOBCommandSession::StopCommandHandler; m_CommandHandlers[BOB_COMMAND_SETNICK] = &BOBCommandSession::SetNickCommandHandler; + m_CommandHandlers[BOB_COMMAND_GETNICK] = &BOBCommandSession::GetNickCommandHandler; m_CommandHandlers[BOB_COMMAND_NEWKEYS] = &BOBCommandSession::NewkeysCommandHandler; m_CommandHandlers[BOB_COMMAND_OUTHOST] = &BOBCommandSession::OuthostCommandHandler; m_CommandHandlers[BOB_COMMAND_OUTPORT] = &BOBCommandSession::OutportCommandHandler; @@ -333,6 +361,8 @@ namespace client BOBCommandChannel::~BOBCommandChannel () { Stop (); + for (auto it: m_Tunnels) + delete it.second; } void BOBCommandChannel::Start () @@ -345,8 +375,7 @@ namespace client void BOBCommandChannel::Stop () { for (auto it: m_Tunnels) - delete it.second; - m_Tunnels.clear (); + it.second->Stop (); m_IsRunning = false; m_Service.stop (); if (m_Thread) @@ -376,6 +405,14 @@ namespace client { m_Tunnels[name] = tunnel; } + + I2PTunnel * BOBCommandChannel::FindTunnel (const std::string& name) + { + auto it = m_Tunnels.find (name); + if (it != m_Tunnels.end ()) + return it->second; + return nullptr; + } void BOBCommandChannel::Accept () { diff --git a/BOB.h b/BOB.h index 7951cfb8..34901f53 100644 --- a/BOB.h +++ b/BOB.h @@ -19,7 +19,9 @@ namespace client const char BOB_COMMAND_ZAP[] = "zap"; const char BOB_COMMAND_QUIT[] = "quit"; const char BOB_COMMAND_START[] = "start"; - const char BOB_COMMAND_SETNICK[] = "setnick"; + const char BOB_COMMAND_STOP[] = "stop"; + const char BOB_COMMAND_SETNICK[] = "setnick"; + const char BOB_COMMAND_GETNICK[] = "getnick"; const char BOB_COMMAND_NEWKEYS[] = "newkeys"; const char BOB_COMMAND_OUTHOST[] = "outhost"; const char BOB_COMMAND_OUTPORT[] = "outport"; @@ -75,7 +77,9 @@ namespace client void ZapCommandHandler (const char * operand, size_t len); void QuitCommandHandler (const char * operand, size_t len); void StartCommandHandler (const char * operand, size_t len); + void StopCommandHandler (const char * operand, size_t len); void SetNickCommandHandler (const char * operand, size_t len); + void GetNickCommandHandler (const char * operand, size_t len); void NewkeysCommandHandler (const char * operand, size_t len); void OuthostCommandHandler (const char * operand, size_t len); void OutportCommandHandler (const char * operand, size_t len); @@ -117,6 +121,7 @@ namespace client boost::asio::io_service& GetService () { return m_Service; }; std::map& GetCommandHandlers () { return m_CommandHandlers; }; void AddTunnel (const std::string& name, I2PTunnel * tunnel); + I2PTunnel * FindTunnel (const std::string& name); private: