diff --git a/ircDDBGateway/Common/G2ProtocolHandler.cpp b/ircDDBGateway/Common/G2ProtocolHandler.cpp index 5f8cf61..097891f 100644 --- a/ircDDBGateway/Common/G2ProtocolHandler.cpp +++ b/ircDDBGateway/Common/G2ProtocolHandler.cpp @@ -144,6 +144,18 @@ CAMBEData* CG2ProtocolHandler::readAMBE() return data; } +void CG2ProtocolHandler::PunchUDPHole(const wxString& address) +{ + unsigned char buffer[1]; + ::memset(buffer, 0, 1); + + in_addr addr = CUDPReaderWriter::lookup(address); + + //wxLogError(wxT("Punching hole to %s"), address.mb_str()); + + m_socket.write(buffer, 1, addr, G2_DV_PORT); +} + void CG2ProtocolHandler::close() { m_socket.close(); diff --git a/ircDDBGateway/Common/G2ProtocolHandler.h b/ircDDBGateway/Common/G2ProtocolHandler.h index 876c276..e489f28 100644 --- a/ircDDBGateway/Common/G2ProtocolHandler.h +++ b/ircDDBGateway/Common/G2ProtocolHandler.h @@ -52,6 +52,8 @@ class CG2ProtocolHandler { CHeaderData* readHeader(); CAMBEData* readAMBE(); + void PunchUDPHole(const wxString& addr); + void close(); private: diff --git a/ircDDBGateway/ircDDBGateway/IRCDDBGatewayThread.cpp b/ircDDBGateway/ircDDBGateway/IRCDDBGatewayThread.cpp index 8e139ba..4c55c51 100644 --- a/ircDDBGateway/ircDDBGateway/IRCDDBGatewayThread.cpp +++ b/ircDDBGateway/ircDDBGateway/IRCDDBGatewayThread.cpp @@ -728,6 +728,7 @@ void CIRCDDBGatewayThread::processIrcDDB() if (!address.IsEmpty()) { wxLogMessage(wxT("USER: %s %s %s %s"), user.c_str(), repeater.c_str(), gateway.c_str(), address.c_str()); m_cache.updateUser(user, repeater, gateway, address, timestamp, DP_DEXTRA, false, false); + m_g2Handler->PunchUDPHole(address); } else { wxLogMessage(wxT("USER: %s NOT FOUND"), user.c_str()); } @@ -744,6 +745,7 @@ void CIRCDDBGatewayThread::processIrcDDB() if (!address.IsEmpty()) { wxLogMessage(wxT("REPEATER: %s %s %s"), repeater.c_str(), gateway.c_str(), address.c_str()); m_cache.updateRepeater(repeater, gateway, address, DP_DEXTRA, false, false); + m_g2Handler->PunchUDPHole(address); } else { wxLogMessage(wxT("REPEATER: %s NOT FOUND"), repeater.c_str()); } @@ -761,6 +763,7 @@ void CIRCDDBGatewayThread::processIrcDDB() if (!address.IsEmpty()) { wxLogMessage(wxT("GATEWAY: %s %s"), gateway.c_str(), address.c_str()); m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false); + m_g2Handler->PunchUDPHole(address); } else { wxLogMessage(wxT("GATEWAY: %s NOT FOUND"), gateway.c_str()); }