[windows] add binding exceptions messagebox notifications, update exceptions handling code

Signed-off-by: R4SAS <r4sas@i2pmail.org>
This commit is contained in:
R4SAS 2020-05-05 02:36:34 +03:00
parent d991cc3b96
commit 42d4781a96
No known key found for this signature in database
GPG key ID: 66F6C87B98EBCFE2
9 changed files with 160 additions and 97 deletions

View file

@ -23,6 +23,11 @@
#include <syslog.h>
#endif
#ifdef WIN32_APP
#include <windows.h>
#include "Win32/Win32App.h"
#endif
enum LogLevel
{
eLogNone = 0,
@ -197,4 +202,42 @@ void LogPrint (LogLevel level, TArgs&&... args) noexcept
log.Append(msg);
}
#ifdef WIN32_APP
/**
* @brief Show message box for user with message in it
* @param level Message level (eLogError, eLogInfo, ...)
* @param args Array of message parts
*/
template<typename... TArgs>
void ShowMessageBox (LogLevel level, TArgs&&... args) noexcept
{
// fold message to single string
std::stringstream ss("");
#if (__cplusplus >= 201703L) // C++ 17 or higher
(LogPrint (ss, std::forward<TArgs>(args)), ...);
#else
LogPrint (ss, std::forward<TArgs>(args)...);
#endif
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
if (!hWnd) hWnd = NULL;
UINT uType;
switch (level) {
case eLogError :
case eLogWarning :
uType = MB_ICONWARNING;
break;
case eLogNone :
case eLogInfo :
case eLogDebug :
default :
uType = MB_ICONINFORMATION;
break;
}
MessageBox( hWnd, TEXT(ss.str ().c_str ()), TEXT("i2pd"), uType | MB_TASKMODAL | MB_OK );
}
#endif // WIN32_APP
#endif // LOG_H__

View file

@ -1195,7 +1195,10 @@ namespace transport
}
catch ( std::exception & ex )
{
LogPrint(eLogError, "NTCP2: Failed to bind to v4 port ",address->port, ex.what());
LogPrint(eLogError, "NTCP2: Failed to bind to v4 port ", address->port, ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv4 NTCP2 transport at port ", address->port, ": ", ex.what ());
#endif
continue;
}
@ -1218,7 +1221,10 @@ namespace transport
auto conn = std::make_shared<NTCP2Session> (*this);
m_NTCP2V6Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCP2Server::HandleAcceptV6, this, conn, std::placeholders::_1));
} catch ( std::exception & ex ) {
LogPrint(eLogError, "NTCP2: failed to bind to v6 port ", address->port);
LogPrint(eLogError, "NTCP2: failed to bind to v6 port ", address->port, ": ", ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv6 NTCP2 transport at port ", address->port, ": ", ex.what ());
#endif
continue;
}
}

View file

@ -823,7 +823,10 @@ namespace transport
LogPrint (eLogInfo, "NTCP: Start listening v6 TCP port ", address->port);
} catch ( std::exception & ex ) {
/** fail to bind ip4 */
LogPrint(eLogError, "NTCP: Failed to bind to v4 port ",address->port, ex.what());
LogPrint(eLogError, "NTCP: Failed to bind to v4 port ", address->port, ": ", ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv4 NTCP transport at port ", address->port, ": ", ex.what ());
#endif
continue;
}
@ -846,7 +849,10 @@ namespace transport
auto conn = std::make_shared<NTCPSession> (*this);
m_NTCPV6Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCPServer::HandleAcceptV6, this, conn, std::placeholders::_1));
} catch ( std::exception & ex ) {
LogPrint(eLogError, "NTCP: failed to bind to v6 port ", address->port);
LogPrint(eLogError, "NTCP: failed to bind to v6 port ", address->port, ": ", ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv6 NTCP transport at port ", address->port, ": ", ex.what ());
#endif
continue;
}
}

View file

@ -53,6 +53,9 @@ namespace transport
LogPrint (eLogInfo, "SSU: Start listening v4 port ", m_Endpoint.port());
} catch ( std::exception & ex ) {
LogPrint (eLogError, "SSU: failed to bind to v4 port ", m_Endpoint.port(), ": ", ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv4 SSU transport at port ", m_Endpoint.port(), ": ", ex.what ());
#endif
}
}
@ -67,6 +70,9 @@ namespace transport
LogPrint (eLogInfo, "SSU: Start listening v6 port ", m_EndpointV6.port());
} catch ( std::exception & ex ) {
LogPrint (eLogError, "SSU: failed to bind to v6 port ", m_EndpointV6.port(), ": ", ex.what());
#ifdef WIN32_APP
ShowMessageBox (eLogError, "Unable to start IPv6 SSU transport at port ", m_Endpoint.port(), ": ", ex.what ());
#endif
}
}
@ -197,7 +203,7 @@ namespace transport
m_SocketV6.close ();
OpenSocketV6 ();
ReceiveV6 ();
}
}
}
}
}
@ -580,7 +586,7 @@ namespace transport
{
return session->GetState () == eSessionStateEstablished && session != excluded;
}
);
);
}
template<typename Filter>
@ -604,7 +610,7 @@ namespace transport
{
return session->GetState () == eSessionStateEstablished && session != excluded;
}
);
);
}
std::set<SSUSession *> SSUServer::FindIntroducers (int maxNumIntroducers)
@ -620,7 +626,7 @@ namespace transport
session->GetState () == eSessionStateEstablished &&
ts < session->GetCreationTime () + SSU_TO_INTRODUCER_SESSION_DURATION;
}
);
);
if (session)
{
ret.insert (session.get ());