diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp
index 167b8c95..c9371ab6 100644
--- a/daemon/HTTPServer.cpp
+++ b/daemon/HTTPServer.cpp
@@ -982,10 +982,10 @@ namespace http {
s << "
";
switch (it->GetSocketType ())
{
- case i2p::client::eSAMSocketTypeSession : s << "session"; break;
- case i2p::client::eSAMSocketTypeStream : s << "stream"; break;
- case i2p::client::eSAMSocketTypeAcceptor : s << "acceptor"; break;
- case i2p::client::eSAMSocketTypeForward : s << "forward"; break;
+ case i2p::client::SAMSocketType::eSAMSocketTypeSession : s << "session"; break;
+ case i2p::client::SAMSocketType::eSAMSocketTypeStream : s << "stream"; break;
+ case i2p::client::SAMSocketType::eSAMSocketTypeAcceptor : s << "acceptor"; break;
+ case i2p::client::SAMSocketType::eSAMSocketTypeForward : s << "forward"; break;
default: s << "unknown"; break;
}
s << " [" << it->GetSocket ().remote_endpoint() << "]";
diff --git a/daemon/I2PControlHandlers.cpp b/daemon/I2PControlHandlers.cpp
index f3ea7f61..c94887a3 100644
--- a/daemon/I2PControlHandlers.cpp
+++ b/daemon/I2PControlHandlers.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2013-2022, The PurpleI2P Project
+* Copyright (c) 2013-2025, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
@@ -340,7 +340,7 @@ namespace client
for (const auto& socket: sam->ListSockets(it.first))
{
boost::property_tree::ptree stream;
- stream.put("type", socket->GetSocketType ());
+ stream.put("type", (int)socket->GetSocketType ());
stream.put("peer", socket->GetSocket ().remote_endpoint());
sam_session_sockets.push_back(std::make_pair("", stream));
diff --git a/libi2pd_client/SAM.cpp b/libi2pd_client/SAM.cpp
index 5956e4f7..52ef1b10 100644
--- a/libi2pd_client/SAM.cpp
+++ b/libi2pd_client/SAM.cpp
@@ -27,7 +27,7 @@ namespace client
SAMSocket::SAMSocket (SAMBridge& owner):
m_Owner (owner), m_Socket(owner.GetService()), m_Timer (m_Owner.GetService ()),
m_BufferOffset (0),
- m_SocketType (eSAMSocketTypeUnknown), m_IsSilent (false),
+ m_SocketType (SAMSocketType::eSAMSocketTypeUnknown), m_IsSilent (false),
m_IsAccepting (false), m_IsReceiving (false)
{
}
@@ -46,13 +46,13 @@ namespace client
}
switch (m_SocketType)
{
- case eSAMSocketTypeSession:
+ case SAMSocketType::eSAMSocketTypeSession:
m_Owner.CloseSession (m_ID);
break;
- case eSAMSocketTypeStream:
+ case SAMSocketType::eSAMSocketTypeStream:
break;
- case eSAMSocketTypeAcceptor:
- case eSAMSocketTypeForward:
+ case SAMSocketType::eSAMSocketTypeAcceptor:
+ case SAMSocketType::eSAMSocketTypeForward:
{
auto session = m_Owner.FindSession(m_ID);
if (session)
@@ -64,7 +64,7 @@ namespace client
}
default: ;
}
- m_SocketType = eSAMSocketTypeTerminated;
+ m_SocketType = SAMSocketType::eSAMSocketTypeTerminated;
if (m_Socket.is_open ())
{
boost::system::error_code ec;
@@ -197,7 +197,7 @@ namespace client
{
LogPrint (eLogDebug, "SAMSocket::SendMessageReply, close=",close?"true":"false", " reason: ", msg);
- if (!m_IsSilent || m_SocketType == eSAMSocketTypeForward)
+ if (!m_IsSilent || m_SocketType == SAMSocketType::eSAMSocketTypeForward)
boost::asio::async_write (m_Socket, boost::asio::buffer (msg, len), boost::asio::transfer_all (),
std::bind(&SAMSocket::HandleMessageReplySent, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, close));
@@ -235,7 +235,7 @@ namespace client
if (ecode != boost::asio::error::operation_aborted)
Terminate ("SAM: read error");
}
- else if (m_SocketType == eSAMSocketTypeStream)
+ else if (m_SocketType == SAMSocketType::eSAMSocketTypeStream)
HandleReceived (ecode, bytes_transferred);
else
{
@@ -352,9 +352,9 @@ namespace client
return;
}
- SAMSessionType type = eSAMSessionTypeUnknown;
+ SAMSessionType type = SAMSessionType::eSAMSessionTypeUnknown;
i2p::datagram::DatagramVersion datagramVersion = i2p::datagram::eDatagramV1;
- if (style == SAM_VALUE_STREAM) type = eSAMSessionTypeStream;
+ if (style == SAM_VALUE_STREAM) type = SAMSessionType::eSAMSessionTypeStream;
#if __cplusplus >= 202002L // C++20
else if (style.starts_with (SAM_VALUE_DATAGRAM))
#else
@@ -362,7 +362,7 @@ namespace client
#endif
{
// DATAGRAM, DATAGRAM1, DATAGRAM2, DATAGRAM3
- type = eSAMSessionTypeDatagram;
+ type = SAMSessionType::eSAMSessionTypeDatagram;
if (style.size () > SAM_VALUE_DATAGRAM.size ())
{
switch (style[SAM_VALUE_DATAGRAM.size ()])
@@ -370,13 +370,13 @@ namespace client
case '1': datagramVersion = i2p::datagram::eDatagramV1; break;
case '2': datagramVersion = i2p::datagram::eDatagramV2; break;
case '3': datagramVersion = i2p::datagram::eDatagramV3; break;
- default: type = eSAMSessionTypeUnknown;
+ default: type = SAMSessionType::eSAMSessionTypeUnknown;
}
}
}
- else if (style == SAM_VALUE_RAW) type = eSAMSessionTypeRaw;
- else if (style == SAM_VALUE_MASTER) type = eSAMSessionTypeMaster;
- if (type == eSAMSessionTypeUnknown)
+ else if (style == SAM_VALUE_RAW) type = SAMSessionType::eSAMSessionTypeRaw;
+ else if (style == SAM_VALUE_MASTER) type = SAMSessionType::eSAMSessionTypeMaster;
+ if (type == SAMSessionType::eSAMSessionTypeUnknown)
{
// unknown style
SendSessionI2PError("Unknown STYLE");
@@ -384,7 +384,7 @@ namespace client
}
std::shared_ptr forward = nullptr;
- if ((type == eSAMSessionTypeDatagram || type == eSAMSessionTypeRaw) &&
+ if ((type == SAMSessionType::eSAMSessionTypeDatagram || type == SAMSessionType::eSAMSessionTypeRaw) &&
params.find(SAM_PARAM_HOST) != params.end() && params.find(SAM_PARAM_PORT) != params.end())
{
// udp forward selected
@@ -431,11 +431,11 @@ namespace client
auto session = m_Owner.CreateSession (id, type, destination == SAM_VALUE_TRANSIENT ? "" : destination, params);
if (session)
{
- m_SocketType = eSAMSocketTypeSession;
- if (type == eSAMSessionTypeDatagram || type == eSAMSessionTypeRaw)
+ m_SocketType = SAMSocketType::eSAMSocketTypeSession;
+ if (type == SAMSessionType::eSAMSessionTypeDatagram || type == SAMSessionType::eSAMSessionTypeRaw)
{
session->UDPEndpoint = forward;
- auto dest = session->GetLocalDestination ()->CreateDatagramDestination (false, datagramVersion);
+ auto dest = session->GetLocalDestination ()->CreateDatagramDestination (true, datagramVersion);
uint16_t port = 0;
if (forward)
{
@@ -443,7 +443,7 @@ namespace client
auto res = std::from_chars(p.data(), p.data() + p.size(), port);
if (res.ec != std::errc()) port = 0;
}
- if (type == eSAMSessionTypeDatagram)
+ if (type == SAMSessionType::eSAMSessionTypeDatagram)
dest->SetReceiver (std::bind (&SAMSocket::HandleI2PDatagramReceive, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5),
port
@@ -510,7 +510,7 @@ namespace client
void SAMSocket::ProcessStreamConnect (char * buf, size_t len, size_t rem)
{
LogPrint (eLogDebug, "SAM: Stream connect: ", buf);
- if ( m_SocketType != eSAMSocketTypeUnknown)
+ if ( m_SocketType != SAMSocketType::eSAMSocketTypeUnknown)
{
SendSessionI2PError ("Socket already in use");
return;
@@ -584,7 +584,7 @@ namespace client
{
if (session->GetLocalDestination ()->SupportsEncryptionType (remote->GetEncryptionType ()))
{
- m_SocketType = eSAMSocketTypeStream;
+ m_SocketType = SAMSocketType::eSAMSocketTypeStream;
m_Stream = session->GetLocalDestination ()->CreateStream (remote);
if (m_Stream)
{
@@ -617,7 +617,7 @@ namespace client
void SAMSocket::ProcessStreamAccept (std::string_view buf)
{
LogPrint (eLogDebug, "SAM: Stream accept: ", buf);
- if ( m_SocketType != eSAMSocketTypeUnknown)
+ if ( m_SocketType != SAMSocketType::eSAMSocketTypeUnknown)
{
SendSessionI2PError ("Socket already in use");
return;
@@ -630,7 +630,7 @@ namespace client
auto session = m_Owner.FindSession (id);
if (session)
{
- m_SocketType = eSAMSocketTypeAcceptor;
+ m_SocketType = SAMSocketType::eSAMSocketTypeAcceptor;
if (!session->GetLocalDestination ()->IsAcceptingStreams ())
{
m_IsAccepting = true;
@@ -737,7 +737,7 @@ namespace client
ep.port(port);
}
- m_SocketType = eSAMSocketTypeForward;
+ m_SocketType = SAMSocketType::eSAMSocketTypeForward;
m_ID = id;
m_IsAccepting = true;
@@ -771,7 +771,7 @@ namespace client
{
i2p::data::IdentityEx dest;
dest.FromBase64 (params[SAM_PARAM_DESTINATION]);
- if (session->Type == eSAMSessionTypeDatagram)
+ if (session->Type == SAMSessionType::eSAMSessionTypeDatagram)
d->SendDatagramTo ((const uint8_t *)data, size, dest.GetIdentHash ());
else // raw
d->SendRawDatagramTo ((const uint8_t *)data, size, dest.GetIdentHash ());
@@ -871,7 +871,7 @@ namespace client
void SAMSocket::ProcessSessionAdd (std::string_view buf)
{
auto session = m_Owner.FindSession(m_ID);
- if (session && session->Type == eSAMSessionTypeMaster)
+ if (session && session->Type == SAMSessionType::eSAMSessionTypeMaster)
{
LogPrint (eLogDebug, "SAM: Subsession add: ", buf);
auto masterSession = std::static_pointer_cast(session);
@@ -884,10 +884,10 @@ namespace client
return;
}
std::string_view style = params[SAM_PARAM_STYLE];
- SAMSessionType type = eSAMSessionTypeUnknown;
- if (style == SAM_VALUE_STREAM) type = eSAMSessionTypeStream;
+ SAMSessionType type = SAMSessionType::eSAMSessionTypeUnknown;
+ if (style == SAM_VALUE_STREAM) type = SAMSessionType::eSAMSessionTypeStream;
// TODO: implement other styles
- if (type == eSAMSessionTypeUnknown)
+ if (type == SAMSessionType::eSAMSessionTypeUnknown)
{
// unknown style
SendSessionI2PError("Unsupported STYLE");
@@ -915,7 +915,7 @@ namespace client
void SAMSocket::ProcessSessionRemove (std::string_view buf)
{
auto session = m_Owner.FindSession(m_ID);
- if (session && session->Type == eSAMSessionTypeMaster)
+ if (session && session->Type == SAMSessionType::eSAMSessionTypeMaster)
{
LogPrint (eLogDebug, "SAM: Subsession remove: ", buf);
auto masterSession = std::static_pointer_cast(session);
@@ -1017,7 +1017,7 @@ namespace client
void SAMSocket::Receive ()
{
- if (m_SocketType == eSAMSocketTypeStream)
+ if (m_SocketType == SAMSocketType::eSAMSocketTypeStream)
{
if (m_IsReceiving) return;
size_t bufSize = SAM_SOCKET_BUFFER_SIZE;
@@ -1137,7 +1137,7 @@ namespace client
}
else
{
- if (m_SocketType != eSAMSocketTypeTerminated)
+ if (m_SocketType != SAMSocketType::eSAMSocketTypeTerminated)
{
if (bytes_transferred > 0)
{
@@ -1168,7 +1168,7 @@ namespace client
if (stream)
{
LogPrint (eLogDebug, "SAM: Incoming I2P connection for session ", m_ID);
- m_SocketType = eSAMSocketTypeStream;
+ m_SocketType = SAMSocketType::eSAMSocketTypeStream;
m_IsAccepting = false;
m_Stream = stream;
context.GetAddressBook ().InsertFullAddress (stream->GetRemoteIdentity ());
@@ -1188,7 +1188,7 @@ namespace client
{
auto socket = session->acceptQueue.front ().first;
session->acceptQueue.pop_front ();
- if (socket && socket->GetSocketType () == eSAMSocketTypeAcceptor)
+ if (socket && socket->GetSocketType () == SAMSocketType::eSAMSocketTypeAcceptor)
{
socket->m_IsAccepting = true;
session->GetLocalDestination ()->AcceptOnce (std::bind (&SAMSocket::HandleI2PAccept, socket, std::placeholders::_1));
@@ -1197,7 +1197,7 @@ namespace client
}
if (!m_IsSilent)
{
- if (m_SocketType != eSAMSocketTypeTerminated)
+ if (m_SocketType != SAMSocketType::eSAMSocketTypeTerminated)
{
// get remote peer address
auto ident = std::make_shared(stream->GetRemoteIdentity()->ToBase64 ()); // we need to keep it until sent
@@ -1224,7 +1224,7 @@ namespace client
{
LogPrint (eLogDebug, "SAM: Incoming forward I2P connection for session ", m_ID);
auto newSocket = std::make_shared(m_Owner);
- newSocket->SetSocketType (eSAMSocketTypeStream);
+ newSocket->SetSocketType (SAMSocketType::eSAMSocketTypeStream);
auto s = shared_from_this ();
newSocket->GetSocket ().async_connect (ep,
[s, newSocket, stream](const boost::system::error_code& ecode)
@@ -1365,7 +1365,7 @@ namespace client
SAMSubSession::SAMSubSession (std::shared_ptr master, std::string_view name, SAMSessionType type, uint16_t port):
SAMSession (master->m_Bridge, name, type), masterSession (master), inPort (port)
{
- if (Type == eSAMSessionTypeStream)
+ if (Type == SAMSessionType::eSAMSessionTypeStream)
{
auto d = masterSession->GetLocalDestination ()->CreateStreamingDestination (inPort);
if (d) d->Start ();
@@ -1381,7 +1381,7 @@ namespace client
void SAMSubSession::StopLocalDestination ()
{
auto dest = GetLocalDestination ();
- if (dest && Type == eSAMSessionTypeStream)
+ if (dest && Type == SAMSessionType::eSAMSessionTypeStream)
{
auto d = dest->RemoveStreamingDestination (inPort);
if (d) d->Stop ();
@@ -1535,7 +1535,7 @@ namespace client
if (localDestination)
{
localDestination->Acquire ();
- auto session = (type == eSAMSessionTypeMaster) ? std::make_shared(*this, id, localDestination) :
+ auto session = (type == SAMSessionType::eSAMSessionTypeMaster) ? std::make_shared(*this, id, localDestination) :
std::make_shared(*this, id, type, localDestination);
std::unique_lock l(m_SessionsMutex);
auto ret = m_Sessions.emplace (id, session);
@@ -1665,9 +1665,9 @@ namespace client
{
i2p::data::IdentityEx dest;
dest.FromBase64 (destination);
- if (session->Type == eSAMSessionTypeDatagram)
+ if (session->Type == SAMSessionType::eSAMSessionTypeDatagram)
datagramDest->SendDatagramTo ((uint8_t *)eol, payloadLen, dest.GetIdentHash ());
- else if (session->Type == eSAMSessionTypeRaw)
+ else if (session->Type == SAMSessionType::eSAMSessionTypeRaw)
datagramDest->SendRawDatagramTo ((uint8_t *)eol, payloadLen, dest.GetIdentHash ());
else
LogPrint (eLogError, "SAM: Unexpected session type ", (int)session->Type, "for session ", sessionID);
diff --git a/libi2pd_client/SAM.h b/libi2pd_client/SAM.h
index d33ebab6..a0ea924d 100644
--- a/libi2pd_client/SAM.h
+++ b/libi2pd_client/SAM.h
@@ -91,7 +91,7 @@ namespace client
constexpr std::string_view SAM_VALUE_RAW { "RAW" };
constexpr std::string_view SAM_VALUE_MASTER { "MASTER" };
- enum SAMSocketType
+ enum class SAMSocketType
{
eSAMSocketTypeUnknown,
eSAMSocketTypeSession,
@@ -184,7 +184,7 @@ namespace client
std::shared_ptr m_Stream;
};
- enum SAMSessionType
+ enum class SAMSessionType
{
eSAMSessionTypeUnknown,
eSAMSessionTypeStream,
@@ -226,7 +226,7 @@ namespace client
{
std::set > subsessions;
SAMMasterSession (SAMBridge & parent, std::string_view name, std::shared_ptr dest):
- SAMSingleSession (parent, name, eSAMSessionTypeMaster, dest) {};
+ SAMSingleSession (parent, name, SAMSessionType::eSAMSessionTypeMaster, dest) {};
void Close ();
};