Hi, i have memory leaks in an app i wrote so i created a simple app that
should register to a sip Registrar (and in fact it does) to try to track
down this problem.
However i must be using the libraries (i use just sipXtack and sipXport) in
the wrong way because i am experiencing a memory leak on each
SipUserAgent->send(SipMessage) i am doing.

thanks a lot
#include <net/SipUserAgent.h>


class SipServer: public OsServerTask {
public:
	SipServer(char *ip, int port, int vb);
	~SipServer();
    virtual UtlBoolean handleMessage(OsMsg& eventMessage);
	void doRegister(char*,char*,char*);
	SipUserAgent *endPoint;
private:
	int mvb;
	OsMsgQ* queue;
	SipMessage *msgRegister;

};

UtlBoolean SipServer::handleMessage(OsMsg& eventMessage)
{
    int msgType = eventMessage.getMsgType();
    int msgSubType = eventMessage.getMsgSubType();
	int seq;
	UtlBoolean ret = TRUE;

    if ((msgType == OsMsg::PHONE_APP) && (msgSubType == SipMessage::NET_SIP_MESSAGE)) {
		const SipMessage* sipMsg = ((SipMessageEvent&)eventMessage).getMessage();
		UtlString method;
		/*if (sipMsg->isResponse()) {
			return ret;
		}*/
		if (sipMsg->getCSeqField(&seq, &method)) {
			if (mvb) {
					UtlString data;
					int len;
					sipMsg->getBytes(&data,&len);
					printf(data.data());
				}
			if (0==method.compareTo(SIP_INVITE_METHOD, UtlString::ignoreCase)) {
				if (mvb) {
					UtlString data;
					int len;
					sipMsg->getBytes(&data,&len);
					printf(data.data());
				}

				SipMessage Response;
				Response.setInviteBusyData(sipMsg);
				endPoint->send(Response);
			}
		}


	}

	return ret;
}


SipServer::SipServer(char *ip, int port, int vb)
{
	endPoint = new SipUserAgent(port,port,0, ip, "sipX", ip);
	endPoint->addMessageObserver(*this->getMessageQueue(),
								 NULL,
								 TRUE,
								 TRUE,
								 TRUE,
								 FALSE);

	mvb = vb;
	msgRegister=0;
	endPoint->allowMethod(SIP_INVITE_METHOD);
	endPoint->allowMethod(SIP_ACK_METHOD);
	endPoint->allowMethod(SIP_CANCEL_METHOD);
	endPoint->allowMethod(SIP_BYE_METHOD);
	endPoint->allowMethod(SIP_REFER_METHOD);
	endPoint->allowMethod(SIP_OPTIONS_METHOD);
	endPoint->start();
	endPoint->startMessageLog();
	start();
}

SipServer::~SipServer()
{
	delete endPoint;
}


void 
SipServer::doRegister(char *pUserUri, char *pContactHeader, char *pOutboundProxyIpAndPort) 
{ 
	if (msgRegister)
	{
		delete msgRegister;
		printf("Deleted old msgRegister\n");
	}
	static int iRegisterCSeqNumber = 1;

	msgRegister = new SipMessage();
	msgRegister->setRegisterData(pUserUri,pUserUri,pOutboundProxyIpAndPort,pContactHeader,"12345",iRegisterCSeqNumber,60);
	endPoint->send(*msgRegister);
} 

#include <signal.h>

typedef void (*sighandler_t)(int);

static int R = 1;

static int handle_SIGINT(int sig)
{
	R = 0;
	return 0;
}


int main(int argc, char *argv[]) {
	SipServer *Server;
	char *ip[2];
	ip[0] = "192.168.23.10";
	ip[1] = "192.168.93.10";
	int port = 5080;
	int vb = 1;
	
	if (argc > 1) {
		ip[0] = argv[1];
	}

	if (argc > 2) {
		port = atoi(argv[2]);
	}

	if (argc > 3) {
		vb = 1;
	}

	for (int j=0; j<1; j++)
	{
	Server = new SipServer(ip[j%2], port, vb);
	signal(SIGINT, (sighandler_t) handle_SIGINT);

	int i=0;
	
	while(R && i <200) {
		Sleep(200);
		printf("pass: %d\n",i++);
		//if (i%10==0)
			if (j%2==0)
				Server->doRegister("<sip:[EMAIL PROTECTED]>","<sip:[EMAIL PROTECTED]:5080>","192.168.23.21:4000");
			else
				Server->doRegister("<sip:[EMAIL PROTECTED]>","<sip:[EMAIL PROTECTED]:5080>","192.168.93.21:4000");
		//sched_yield();
	}
	printf("ShutDown\n");
	Sleep(2000);
	delete Server;
	printf("DONE\n");
	}
}
_______________________________________________
sipxtapi-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipxtapi-dev/

Reply via email to