Added a helper class SocketRef and use it instead of all ad-hoc similar classes.
Fixed a memory leak in Jabber SSL listeners. git-svn-id: http://yate.null.ro/svn/yate/trunk@6299 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
65bc140298
commit
1dc8d69a8e
|
@ -3881,23 +3881,6 @@ TcpListener::~TcpListener()
|
|||
__plugin.listener(this,false);
|
||||
}
|
||||
|
||||
// Objects added to socket.ssl message when incoming connection is using SSL
|
||||
class RefSocket : public RefObject
|
||||
{
|
||||
public:
|
||||
inline RefSocket(Socket** sock)
|
||||
: m_socket(sock)
|
||||
{}
|
||||
virtual void* getObject(const String& name) const {
|
||||
if (name == YATOM("Socket*"))
|
||||
return (void*)m_socket;
|
||||
return RefObject::getObject(name);
|
||||
}
|
||||
Socket** m_socket;
|
||||
private:
|
||||
RefSocket() {}
|
||||
};
|
||||
|
||||
// Bind and listen
|
||||
void TcpListener::run()
|
||||
{
|
||||
|
@ -3942,7 +3925,9 @@ void TcpListener::run()
|
|||
processed = m_engine && m_engine->acceptConn(sock,addr,m_type);
|
||||
else {
|
||||
Message m("socket.ssl");
|
||||
m.userData(new RefSocket(&sock));
|
||||
SocketRef* s = new SocketRef(sock);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
m.addParam("server",String::boolText(true));
|
||||
m.addParam("context",m_sslContext);
|
||||
if (Engine::dispatch(m))
|
||||
|
|
|
@ -161,22 +161,6 @@ static ObjList s_listeners;
|
|||
class Connection;
|
||||
class RManagerThread;
|
||||
|
||||
class SockRef : public RefObject
|
||||
{
|
||||
public:
|
||||
inline SockRef(Socket** sock)
|
||||
: m_sock(sock)
|
||||
{ }
|
||||
void* getObject(const String& name) const
|
||||
{
|
||||
if (name == YATOM("Socket*"))
|
||||
return m_sock;
|
||||
return RefObject::getObject(name);
|
||||
}
|
||||
private:
|
||||
Socket** m_sock;
|
||||
};
|
||||
|
||||
class RManagerListener : public RefObject
|
||||
{
|
||||
friend class RManagerThread;
|
||||
|
@ -409,7 +393,7 @@ Connection* RManagerListener::checkCreate(Socket* sock, const char* addr)
|
|||
m.addParam("server",String::boolText(true));
|
||||
m.addParam(secure->name(),*secure);
|
||||
m.copyParam(m_cfg,"verify");
|
||||
SockRef* s = new SockRef(&sock);
|
||||
SocketRef* s = new SocketRef(sock);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
if (!(Engine::dispatch(m) && sock)) {
|
||||
|
|
|
@ -38,7 +38,6 @@ namespace { // anonymous
|
|||
class Transport;
|
||||
class TransportWorker;
|
||||
class TransportThread;
|
||||
class SockRef;
|
||||
class MessageReader;
|
||||
class TReader;
|
||||
class StreamReader;
|
||||
|
@ -78,22 +77,6 @@ private:
|
|||
Mutex m_threadMutex;
|
||||
};
|
||||
|
||||
class SockRef : public RefObject
|
||||
{
|
||||
public:
|
||||
inline SockRef(Socket** sock)
|
||||
: m_sock(sock)
|
||||
{ }
|
||||
void* getObject(const String& name) const
|
||||
{
|
||||
if (name == "Socket*")
|
||||
return m_sock;
|
||||
return RefObject::getObject(name);
|
||||
}
|
||||
private:
|
||||
Socket** m_sock;
|
||||
};
|
||||
|
||||
class TransportThread : public Thread
|
||||
{
|
||||
friend class TransportWorker;
|
||||
|
@ -396,7 +379,7 @@ bool ListenerThread::init(const NamedList& param)
|
|||
{
|
||||
Socket* soc = 0;
|
||||
Message m("socket.sctp");
|
||||
SockRef* s = new SockRef(&soc);
|
||||
SocketRef* s = new SocketRef(soc);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
if (!(Engine::dispatch(m) && soc)) {
|
||||
|
@ -780,7 +763,7 @@ bool Transport::bindSocket()
|
|||
{
|
||||
Socket* soc = 0;
|
||||
Message m("socket.sctp");
|
||||
SockRef* s = new SockRef(&soc);
|
||||
SocketRef* s = new SocketRef(soc);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
if (!(Engine::dispatch(m) && soc)) {
|
||||
|
@ -905,7 +888,7 @@ bool Transport::connectSocket()
|
|||
case Sctp :
|
||||
{
|
||||
Message m("socket.sctp");
|
||||
SockRef* s = new SockRef(&sock);
|
||||
SocketRef* s = new SocketRef(sock);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
if (!(Engine::dispatch(m) && sock)) {
|
||||
|
@ -1088,7 +1071,7 @@ bool Transport::addSocket(Socket* socket,SocketAddr& socketAddress)
|
|||
Message m("socket.sctp");
|
||||
m.addParam("handle",String(socket->detach()));
|
||||
delete socket;
|
||||
SockRef* s = new SockRef(&sock);
|
||||
SocketRef* s = new SocketRef(sock);
|
||||
m.userData(s);
|
||||
TelEngine::destruct(s);
|
||||
if (!(Engine::dispatch(m) && sock)) {
|
||||
|
|
|
@ -1096,32 +1096,6 @@ private:
|
|||
int m_code;
|
||||
};
|
||||
|
||||
// Proxy class used to transport a data buffer or a socket
|
||||
// The object doesn't own its data
|
||||
class RefObjectProxy : public RefObject
|
||||
{
|
||||
public:
|
||||
inline RefObjectProxy()
|
||||
: m_data(0), m_socket(0)
|
||||
{}
|
||||
inline RefObjectProxy(DataBlock* data)
|
||||
: m_data(data), m_socket(0)
|
||||
{}
|
||||
inline RefObjectProxy(Socket** sock)
|
||||
: m_data(0), m_socket(sock)
|
||||
{}
|
||||
virtual void* getObject(const String& name) const {
|
||||
if (name == YATOM("DataBlock"))
|
||||
return m_data;
|
||||
if (name == YATOM("Socket*"))
|
||||
return (void*)m_socket;
|
||||
return RefObject::getObject(name);
|
||||
}
|
||||
private:
|
||||
DataBlock* m_data;
|
||||
Socket** m_socket;
|
||||
};
|
||||
|
||||
class SIPDriver : public Driver
|
||||
{
|
||||
public:
|
||||
|
@ -9550,7 +9524,7 @@ bool SIPDriver::socketSsl(Socket** sock, bool server, const String& context)
|
|||
m.addParam("key",s_sslKeyFile,false);
|
||||
}
|
||||
if (sock && *sock) {
|
||||
RefObjectProxy* p = new RefObjectProxy(sock);
|
||||
SocketRef* p = new SocketRef(sock);
|
||||
m.userData(p);
|
||||
TelEngine::destruct(p);
|
||||
}
|
||||
|
|
36
yateclass.h
36
yateclass.h
|
@ -7473,6 +7473,42 @@ public:
|
|||
virtual bool setPayload(u_int32_t payload) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper class for insering a Socket pointer as a RefObject in a Message
|
||||
* @short RefObject holding a Socket pointer
|
||||
*/
|
||||
class YATE_API SocketRef : public RefObject
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor from pointer
|
||||
* @param socket Pointer to the Socket* to hold
|
||||
*/
|
||||
inline SocketRef(Socket** socket)
|
||||
: m_socket(socket)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Constructor from reference
|
||||
* @param socket Reference to the Socket* to hold
|
||||
*/
|
||||
inline SocketRef(Socket*& socket)
|
||||
: m_socket(&socket)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Get a pointer to a derived class given that class name
|
||||
* @param name Name of the class we are asking for
|
||||
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
||||
*/
|
||||
virtual void* getObject(const String& name) const
|
||||
{ return (name == YATOM("Socket*")) ? m_socket : RefObject::getObject(name); }
|
||||
|
||||
private:
|
||||
SocketRef();
|
||||
void* m_socket;
|
||||
};
|
||||
|
||||
/**
|
||||
* This class holds a DNS (resolver) record
|
||||
* @short A DNS record
|
||||
|
|
Loading…
Reference in New Issue