aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/objects/class_socket.cpp
diff options
context:
space:
mode:
authorGravatar Noldor2007-01-23 16:31:02 +0000
committerGravatar Noldor2007-01-23 16:31:02 +0000
commit52c050dd0ff72f7399cb1bd743d20c7d447e094b (patch)
tree157dff75036a7d72df47787ad3eeebc5a095944e /src/modules/objects/class_socket.cpp
parentadded seenserv command (diff)
downloadKVIrc-52c050dd0ff72f7399cb1bd743d20c7d447e094b.tar.gz
KVIrc-52c050dd0ff72f7399cb1bd743d20c7d447e094b.tar.bz2
KVIrc-52c050dd0ff72f7399cb1bd743d20c7d447e094b.zip
added new buttongroup classes,dcc.setBandwidthLimit; fixed/removed some old code, added doc to dynamictooltips
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@234 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules/objects/class_socket.cpp')
-rw-r--r--src/modules/objects/class_socket.cpp839
1 files changed, 2 insertions, 837 deletions
diff --git a/src/modules/objects/class_socket.cpp b/src/modules/objects/class_socket.cpp
index fbabdad85..09bc0fb57 100644
--- a/src/modules/objects/class_socket.cpp
+++ b/src/modules/objects/class_socket.cpp
@@ -359,832 +359,6 @@ void KviScriptSocketObject::reset()
[/example]
*/
-/*
-#define REG_FH(__name,__func) \
- g_pSocketClass->registerFunctionHandler(__name,(KviScriptObjectFunctionHandlerProc)(KVI_PTR2MEMBER(KviScriptSocketObject::__func)),0,true)
-
-
-void KviScriptSocketObject::registerSelf()
-{
- KviScriptObjectClass * base = g_pScriptObjectController->lookupClass("object");
-
- __range_valid(base);
- g_pSocketClass = new KviScriptObjectClass(base,"socket",socketClassCreateInstance,true);
-
- REG_FH("status",functionStatus);
- REG_FH("remotePort",functionRemotePort);
- REG_FH("remoteIp",functionRemoteIp);
- REG_FH("localIp",functionLocalIp);
- REG_FH("localPort",functionLocalPort);
- REG_FH("connect",functionConnect);
- REG_FH("connectTimeout",functionConnectTimeout);
- REG_FH("setConnectTimeout",functionSetConnectTimeout);
- REG_FH("close",functionClose);
- REG_FH("read",functionRead);
- REG_FH("readHex",functionReadHex);
- REG_FH("write",functionWrite);
- REG_FH("writeHex",functionWriteHex);
- REG_FH("listen",functionListen);
- REG_FH("accept",functionAccept);
-
- g_pSocketClass->registerEmptyFunctionHandler("connectEvent");
- g_pSocketClass->registerEmptyFunctionHandler("connectFailedEvent");
- g_pSocketClass->registerEmptyFunctionHandler("disconnectEvent");
- g_pSocketClass->registerEmptyFunctionHandler("dataAvailableEvent");
- g_pSocketClass->registerEmptyFunctionHandler("incomingConnectionEvent");
-}
-
-#undef REG_FH
-
-void KviScriptSocketObject::unregisterSelf()
-{
- delete g_pSocketClass; // this will delete all the objects of this class
- g_pSocketClass = 0;
-}
-
-bool KviScriptSocketObject::functionStatus(KviCommand *c,KviParameterList *,KviStr &buffer)
-{
- buffer.append(KviStr::Format,"%d",m_iStatus);
- return true;
-}
-
-bool KviScriptSocketObject::functionClose(KviCommand *c,KviParameterList *,KviStr &buffer)
-{
- if((m_pOutBuffer->size() != 0) && (m_iStatus == KVI_SCRIPT_SOCKET_STATUS_CONNECTED))
- tryFlush();
-
- reset();
- return true;
-}
-
-bool KviScriptSocketObject::functionConnectTimeout(KviCommand *c,KviParameterList *,KviStr &buffer)
-{
- buffer.append(KviStr::Format,"%u",m_uConnectTimeout);
- return true;
-}
-
-bool KviScriptSocketObject::functionSetConnectTimeout(KviCommand *c,KviParameterList *params,KviStr &buffer)
-{
- ENTER_STACK_FRAME(c,"socket::setConnectTimeout");
- KviStr szTimeout = params->safeFirstParam();
- bool bOk;
- unsigned int uTimeout = szTimeout.toUInt(&bOk);
- if(!bOk)
- {
- c->warning(__tr("Invalid timeout (%s)"),szTimeout.ptr());
- return c->leaveStackFrame();
- }
- m_uConnectTimeout = uTimeout;
- return c->leaveStackFrame();
-}
-
-bool KviScriptSocketObject::functionRemotePort(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- buffer.append(KviStr::Format,"%u",m_uRemotePort);
- return true;
-}
-
-bool KviScriptSocketObject::functionRemoteIp(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- buffer.append(m_szRemoteIp);
- return true;
-}
-
-bool KviScriptSocketObject::functionLocalPort(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- buffer.append(KviStr::Format,"%u",m_uLocalPort);
- return true;
-}
-
-bool KviScriptSocketObject::functionLocalIp(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- buffer.append(m_szLocalIp);
- return true;
-}
-
-bool KviScriptSocketObject::functionListen(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- ENTER_STACK_FRAME(c,"socket::listen");
- if((m_sock != KVI_INVALID_SOCKET) || (m_iStatus != KVI_SCRIPT_SOCKET_STATUS_DISCONNECTED))
- {
- c->warning(__tr("Another connection in progress"));
- buffer.append('0');
- return c->leaveStackFrame();
- }
-
- KviStr szPort = *(params->safeFirst());
- if(szPort.hasData())
- {
- bool bOk;
- m_uLocalPort = szPort.toUShort(&bOk);
- if(!bOk)
- {
- c->warning(__tr("Invalid port specified: the kernel will choose one"));
- m_uLocalPort = 0;
- }
- } else m_uLocalPort = 0;
-
- KviStr m_szLocalIp = *(params->safeNext());
-
- params->safeNext();
- m_bIpV6 = params->getBool();
-
-#ifndef COMPILE_IPV6_SUPPORT
- if(m_bIpV6)
- {
- c->warning(__tr("No IPV6 support in this executable"));
- buffer.append('0');
- reset();
- return c->leaveStackFrame();
- }
-#endif
-
- bool bGotIp = false;
-
- if(m_szLocalIp.hasData())
- {
- // Check the address type
- if(kvi_isValidStringIp(m_szLocalIp.ptr()))bGotIp = true;
- else {
-#ifdef COMPILE_IPV6_SUPPORT
- if(kvi_isValidStringIp_V6(m_szLocalIp.ptr()))
- {
- bGotIp = true;
- m_bIpV6 = true;
- } else {
-#else
- c->warning(__tr("Invalid IP address specified (%s)"),m_szLocalIp.ptr());
- buffer.append('0');
- reset();
- return c->leaveStackFrame();
-#endif
-#ifdef COMPILE_IPV6_SUPPORT
- }
-#endif
- }
- }
-
-
-#ifdef COMPILE_IPV6_SUPPORT
- m_sock = kvi_socket_create(m_bIpV6 ? KVI_SOCKET_PF_INET6 : KVI_SOCKET_PF_INET,
- KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP);
-#else
- m_sock = kvi_socket_create(KVI_SOCKET_PF_INET,KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP);
-#endif
-
- if(m_sock == KVI_INVALID_SOCKET)
- {
- c->warning(__tr("Socket creation failed"));
- buffer.append('0');
- reset();
- return c->leaveStackFrame();
- }
-
- if(m_szLocalIp.hasData())
- {
-#ifdef COMPILE_IPV6_SUPPORT
- KviSockaddr sa(m_szLocalIp.ptr(),m_uLocalPort,m_bIpV6);
-#else
- KviSockaddr sa(m_szLocalIp.ptr(),m_uLocalPort,false);
-#endif
- if(!sa.socketAddress())
- {
- c->warning(__tr("Invalid socket address"));
- reset();
- buffer.append('0');
- return c->leaveStackFrame();
- }
-
- if(!kvi_socket_bind(m_sock,sa.socketAddress(),((int)(sa.addressLength()))))
- {
- c->warning(__tr("Bind failure"));
- reset();
- buffer.append('0');
- return c->leaveStackFrame();
- }
- } else {
-#ifdef COMPILE_IPV6_SUPPORT
- KviSockaddr sa(m_uLocalPort,m_bIpV6);
-#else
- KviSockaddr sa(m_uLocalPort,false);
-#endif
- if(!sa.socketAddress())
- {
- c->warning(__tr("Invalid socket address"));
- reset();
- buffer.append('0');
- return c->leaveStackFrame();
- }
-
- if(!kvi_socket_bind(m_sock,sa.socketAddress(),((int)(sa.addressLength()))))
- {
- c->warning(__tr("Bind failure"));
- reset();
- buffer.append('0');
- return c->leaveStackFrame();
- }
- }
-
-
- if(!kvi_socket_listen(m_sock,5))
- {
- c->warning(__tr("Listen failure"));
- reset();
- buffer.append('0');
- return c->leaveStackFrame();
- }
-
-
- // Reread the port in case we're binding to a random one (0)
-
-#ifdef COMPILE_IPV6_SUPPORT
- KviSockaddr sareal(0,m_bIpV6);
-#else
- KviSockaddr sareal(0,false);
-#endif
-
- int size = (int)sareal.addressLength();
-
- if(kvi_socket_getsockname(m_sock,sareal.socketAddress(),&size))
- {
- m_uLocalPort = sareal.port();
- sareal.getStringAddress(m_szLocalIp);
- }
-
- // and setup the READ notifier...
- m_pSn = new QSocketNotifier(m_sock,QSocketNotifier::Read);
- QObject::connect(m_pSn,SIGNAL(activated(int)),this,SLOT(incomingConnection(int)));
- m_pSn->setEnabled(true);
-
- m_iStatus = KVI_SCRIPT_SOCKET_STATUS_LISTENING;
-
- buffer.append('1');
-
- return c->leaveStackFrame();
-}
-
-void KviScriptSocketObject::incomingConnection(int)
-{
-#ifdef COMPILE_IPV6_SUPPORT
- struct sockaddr_in6 hostSockAddr6;
-#endif
- struct sockaddr_in hostSockAddr;
-
- int size = sizeof(hostSockAddr);
- struct sockaddr * addr = (struct sockaddr *)&hostSockAddr;
-
-#ifdef COMPILE_IPV6_SUPPORT
- if(m_bIpV6)
- {
- addr = (struct sockaddr *)&hostSockAddr6;
- size = sizeof(hostSockAddr6);
- }
-#endif
-
- // Incoming connection
- m_secondarySock = kvi_socket_accept(m_sock,addr,&size);
- if(m_secondarySock != KVI_INVALID_SOCKET)
- {
- // Connected
-#ifdef COMPILE_IPV6_SUPPORT
- if(m_bIpV6)
- {
- m_uSecondaryPort = ntohs(((struct sockaddr_in6 *)addr)->sin6_port);
- if(!kvi_binaryIpToStringIp_V6(((struct sockaddr_in6 *)addr)->sin6_addr,m_szSecondaryIp))
- m_szSecondaryIp = __tr("unknown");
- } else {
-#endif
- m_uSecondaryPort = ntohs(((struct sockaddr_in *)addr)->sin_port);
- if(!kvi_binaryIpToStringIp(((struct sockaddr_in *)addr)->sin_addr,m_szSecondaryIp))
- m_szSecondaryIp = __tr("unknown");
-#ifdef COMPILE_IPV6_SUPPORT
- }
-#endif
- callEventFunction("incomingConnectionEvent",0,0);
- if(m_secondarySock != KVI_INVALID_SOCKET)
- {
- kvi_socket_close(m_secondarySock);
- m_secondarySock = KVI_INVALID_SOCKET;
- m_uSecondaryPort = 0;
- m_szSecondaryIp.clear();
- }
-
- } // else..huh ?... wait for the next notifier call
-}
-
-void KviScriptSocketObject::acceptConnection(kvi_socket_t s,unsigned short int uPort,const char * szIp)
-{
- reset();
- m_sock = s;
- m_uRemotePort = uPort;
- m_szRemoteIp = szIp;
-#ifdef COMPILE_IPV6_SUPPORT
- KviSockaddr sareal(0,m_bIpV6);
-#else
- KviSockaddr sareal(0,false);
-#endif
-
- int size = (int)sareal.addressLength();
-
- if(kvi_socket_getsockname(m_sock,sareal.socketAddress(),&size))
- {
- m_uLocalPort = sareal.port();
- sareal.getStringAddress(m_szLocalIp);
- }
-
- m_iStatus = KVI_SCRIPT_SOCKET_STATUS_CONNECTED;
-
- m_pSn = new QSocketNotifier((int)m_sock,QSocketNotifier::Read);
- QObject::connect(m_pSn,SIGNAL(activated(int)),this,SLOT(readNotifierFired(int)));
- m_pSn->setEnabled(true);
-}
-
-
-bool KviScriptSocketObject::functionAccept(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- ENTER_STACK_FRAME(c,"socket::accept");
-
- KviScriptObject * ob = g_pScriptObjectController->lookupObject(params->safeFirstParam());
-
- if(!ob)
- {
- c->warning(__tr("No socket object specified"));
- return c->leaveStackFrame();
- }
-
- if(!ob->inherits("KviScriptSocketObject"))
- {
- c->warning(__tr("Invalid socket object specified (it doesn't inherit from socket)"));
- return c->leaveStackFrame();
- }
-
- if(m_secondarySock != KVI_INVALID_SOCKET)
- {
- ((KviScriptSocketObject *)ob)->acceptConnection(m_secondarySock,m_uSecondaryPort,m_szSecondaryIp.ptr());
-
- m_secondarySock = KVI_INVALID_SOCKET;
- m_uSecondaryPort = 0;
- m_szSecondaryIp.clear();
- } else {
- c->warning(__tr("There is no connection to accept!"));
- }
- return c->leaveStackFrame();
-}
-
-bool KviScriptSocketObject::functionConnect(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- ENTER_STACK_FRAME(c,"socket::connect");
- if((m_sock != KVI_INVALID_SOCKET) || (m_iStatus != KVI_SCRIPT_SOCKET_STATUS_DISCONNECTED))
- {
- c->warning(__tr("Another connection in progress"));
- buffer.append("0");
- return c->leaveStackFrame();
- }
-
- m_szRemoteIp = params->safeFirstParam();
- KviStr szRemotePort = params->safeNextParam();
- bool bOk;
- m_uRemotePort = szRemotePort.toUShort(&bOk);
- if(!bOk)
- {
- c->warning(__tr("Invalid port (%s)"),szRemotePort.ptr());
- buffer.append('0');
- return c->leaveStackFrame();
- }
-
-#ifdef COMPILE_IPV6_SUPPORT
- if(kvi_isValidStringIp(m_szRemoteIp.ptr()) || kvi_isValidStringIp_V6(m_szRemoteIp.ptr()))
-#else
- if(kvi_isValidStringIp(m_szRemoteIp.ptr()))
-#endif
- {
- m_iStatus = KVI_SCRIPT_SOCKET_STATUS_CONNECTING;
- delayedConnect();
- } else {
- m_iStatus = KVI_SCRIPT_SOCKET_STATUS_DNS;
- delayedLookupRemoteIp();
- }
- buffer.append('1');
- return c->leaveStackFrame();
-}
-
-void KviScriptSocketObject::delayedConnect()
-{
- if(m_pDelayTimer)delete m_pDelayTimer;
- m_pDelayTimer = new QTimer();
- connect(m_pDelayTimer,SIGNAL(timeout()),this,SLOT(doConnect()));
- m_pDelayTimer->start(0,true);
-}
-
-void KviScriptSocketObject::doConnect()
-{
- if(m_pDelayTimer)delete m_pDelayTimer;
- m_pDelayTimer = 0;
-
-
- KviSockaddr sa(m_szRemoteIp.ptr(),m_uRemotePort,!kvi_isValidStringIp(m_szRemoteIp.ptr()));
-
- if(!sa.socketAddress())
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(KviStr::Format,__tr("Invalid ip address (%s)"),m_szRemoteIp.ptr())));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
-
-
- // create the socket
-#ifdef COMPILE_IPV6_SUPPORT
- m_bIpV6 = sa.isIpV6();
- m_sock = kvi_socket_create(sa.isIpV6() ? KVI_SOCKET_PF_INET6 : KVI_SOCKET_PF_INET,KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP);
-#else
- m_bIpV6 = false;
- m_sock = kvi_socket_create(KVI_SOCKET_PF_INET,KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP);
-#endif
-
- if(m_sock == KVI_INVALID_SOCKET)
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(__tr("Failed to create the socket"))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
-
- if(!kvi_socket_setNonBlocking(m_sock))
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(__tr("Failed to setup a nonblocking socket"))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
-
- if(!kvi_socket_connect(m_sock,sa.socketAddress(),((int)(sa.addressLength()))))
- {
- int err = kvi_socket_error();
- if(!kvi_socket_recoverableConnectError(err))
- {
- // Ops...
- int sockError=err;
- if(sockError==0)
- {
- // Zero error ?...let's look closer
- int iSize=sizeof(int);
- if(!kvi_socket_getsockopt(m_sock,SOL_SOCKET,SO_ERROR,
- (void *)&sockError,&iSize))sockError=0;
- }
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(KviStr::Format,__tr("Connect failure: %s"),KviError::getDescription(KviError::translateSystemError(sockError)).utf8().data())));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
- }
-
- m_pDelayTimer = new QTimer();
- connect(m_pDelayTimer,SIGNAL(timeout()),this,SLOT(connectTimeout()));
- m_pDelayTimer->start(m_uConnectTimeout,true);
-
- m_pSn = new QSocketNotifier((int)m_sock,QSocketNotifier::Write);
- QObject::connect(m_pSn,SIGNAL(activated(int)),this,SLOT(writeNotifierFired(int)));
- m_pSn->setEnabled(true);
-}
-
-void KviScriptSocketObject::connectTimeout()
-{
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(__tr("Connect attempt timed out"))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
-}
-/*
-void KviScriptSocketObject::delayedLookupRemoteIp()
-{
- if(m_pDelayTimer)delete m_pDelayTimer;
- m_pDelayTimer = new QTimer();
- connect(m_pDelayTimer,SIGNAL(timeout()),this,SLOT(lookupRemoteIp()));
- m_pDelayTimer->start(0,true);
-}
-
-void KviScriptSocketObject::lookupRemoteIp()
-{
- if(m_pDelayTimer)delete m_pDelayTimer;
- m_pDelayTimer = 0;
- if(m_pDns)delete m_pDns;
- m_pDns = new KviDns();
- connect(m_pDns,SIGNAL(lookupDone(KviDns *)),this,SLOT(lookupDone(KviDns *)));
- if(!m_pDns->lookup(m_szRemoteIp.ptr(),KviDns::Any))
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(__tr("Can't start the DNS thread"))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- }
-}
-
-void KviScriptSocketObject::lookupDone(KviDns *pDns)
-{
- if(pDns->state() != KviDns::Success)
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(KviError::getDescription(pDns->error()))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
- m_szRemoteIp = pDns->firstIpAddress();
- delete m_pDns;
- m_pDns = 0;
- doConnect();
-}
-
-void KviScriptSocketObject::writeNotifierFired(int)
-{
- if(m_pSn)
- {
- delete m_pSn;
- m_pSn = 0;
- }
- if(m_pDelayTimer)
- {
- delete m_pDelayTimer;
- m_pDelayTimer = 0;
- }
-
- // Check for errors...
- int sockError;
- int iSize=sizeof(int);
- if(!kvi_socket_getsockopt(m_sock,SOL_SOCKET,SO_ERROR,(void *)&sockError,&iSize))sockError = -1;
- //sockError = 0;
- if(sockError != 0)
- {
- //debug("Failed here %d",sockError);
- //failed
- if(sockError > 0)sockError = KviError::translateSystemError(sockError);
- else sockError = KviError_unknownError; //Error 0 ?
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectFailedEvent",0,new KviParameterList(
- new KviStr(KviError::getDescription(sockError))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- } else {
- // Succesfully connected
- // create the correct read notifier now...
- m_pSn = new QSocketNotifier((int)m_sock,QSocketNotifier::Read);
- QObject::connect(m_pSn,SIGNAL(activated(int)),this,SLOT(readNotifierFired(int)));
- m_pSn->setEnabled(true);
-
-#ifdef COMPILE_IPV6_SUPPORT
- KviSockaddr sareal(0,m_bIpV6);
-#else
- KviSockaddr sareal(0,false);
-#endif
- int size = (int)sareal.addressLength();
- if(kvi_socket_getsockname(m_sock,sareal.socketAddress(),&size))
- {
- m_uLocalPort = sareal.port();
- sareal.getStringAddress(m_szLocalIp);
- }
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("connectEvent",0,0);
- if(m_uConnectionId == uOldConnectionId)
- m_iStatus = KVI_SCRIPT_SOCKET_STATUS_CONNECTED;
- // else the connection has been already changed!
- }
-}
-
-void KviScriptSocketObject::readNotifierFired(int)
-{
- //read data
- if((m_uInBufferLen - m_uInDataLen) < KVI_READ_CHUNK)
- {
- m_uInBufferLen += KVI_IN_BUFFER_ALLOC_CHUNK;
- m_pInBuffer = (char *)kvi_realloc(m_pInBuffer,m_uInBufferLen);
- }
-
- int readLength = kvi_socket_recv(m_sock,m_pInBuffer + m_uInDataLen,KVI_READ_CHUNK);
-
- if(readLength <= 0)
- {
- if(readLength==0)
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("disconnectEvent",0,0);
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- } else {
- //check for transmission errors
- int err = kvi_socket_error();
-#ifdef COMPILE_ON_WINDOWS
- if((err != EAGAIN) && (err != EINTR) && (err != WSAEWOULDBLOCK))
-#else
- if((err != EAGAIN) && (err != EINTR))
-#endif
- {
- unsigned int uOldConnectionId = m_uConnectionId;
- if(err > 0)
- {
- callEventFunction("disconnectEvent",0,new KviParameterList(
- new KviStr(KviError::getDescription(KviError::translateSystemError(err)))));
- } else {
- callEventFunction("disconnectEvent",0,new KviParameterList(
- new KviStr(KviError::getDescription(KviError_remoteEndClosedConnection))));
- }
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- } //else transient error...wait again...
- }
- return; // can do nothing
- }
- // readLength > 0
- m_uInDataLen += readLength;
-
- KviStr * s = new KviStr();
- s->setNum(m_uInDataLen);
-
-
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("dataAvailableEvent",0,new KviParameterList(s));
- if(m_uConnectionId == uOldConnectionId)
- {
- if(m_uInDataLen > (4096 * 1024)) // too much data in buffer (not reading)
- {
- callEventFunction("disconnectEvent",0,new KviParameterList(
- new KviStr(__tr("Too much unprocessed incoming data (you've left this socket unmanaged ?)"))));
- reset();
- }
- }
-}
-
-void KviScriptSocketObject::eatInData(unsigned int uLen)
-{
- if(uLen > m_uInDataLen)uLen = m_uInDataLen;
-
- m_uInDataLen -= uLen;
-
- if(m_uInDataLen > 0)
- {
- kvi_memmove(m_pInBuffer,m_pInBuffer + uLen,m_uInDataLen);
- }
-
- unsigned int uSpace = m_uInBufferLen - m_uInDataLen;
-
- if(uSpace > KVI_IN_BUFFER_ALLOC_CHUNK)
- {
- m_uInBufferLen -= KVI_IN_BUFFER_ALLOC_CHUNK;
- m_pInBuffer = (char *)kvi_realloc(m_pInBuffer,m_uInBufferLen);
- }
-}
-
-unsigned int KviScriptSocketObject::readGetLength(KviParameterList * params)
-{
- KviStr * pszLen = params->safeFirst();
- unsigned int uLen = m_uInDataLen;
- if(pszLen)
- {
- bool bOk;
- uLen = pszLen->toInt(&bOk);
- if(!bOk)uLen = m_uInDataLen;
- }
-
- if(uLen > m_uInDataLen)uLen = m_uInDataLen;
- return uLen;
-}
-
-bool KviScriptSocketObject::functionRead(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- unsigned int uLen = readGetLength(params);
-
- if(uLen > 0)
- {
- // convert NULLS to char 255
- for(unsigned int i = 0;i < uLen;i++)
- {
- if(!m_pInBuffer[i])m_pInBuffer[i] = (char)(255);
- }
-
- buffer.append(m_pInBuffer,uLen);
-
- eatInData(uLen);
- }
- return true;
-}
-
-bool KviScriptSocketObject::functionReadHex(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- unsigned int uLen = readGetLength(params);
-
- if(uLen > 0)
- {
- KviStr szTmp;
- szTmp.bufferToHex(m_pInBuffer,uLen);
- buffer.append(szTmp);
- eatInData(uLen);
- }
- return true;
-}
-
-bool KviScriptSocketObject::functionWrite(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- KviStr * pszData = params->safeFirst();
-
- if(pszData)
- {
- if(pszData->len() > 0)
- {
- m_pOutBuffer->append((const unsigned char *)(pszData->ptr()),pszData->len());
- delayedFlush(0);
- }
- }
- return true;
-}
-
-bool KviScriptSocketObject::functionWriteHex(KviCommand *c,KviParameterList * params,KviStr &buffer)
-{
- KviStr * pszData = params->safeFirst();
- int len = 0;
- if(pszData)
- {
- if(pszData->len() > 0)
- {
- char * ptr;
- len = pszData->hexToBuffer(&ptr);
- if(len > 0)
- {
- m_pOutBuffer->append((const unsigned char *)(ptr),len);
- delayedFlush(0);
- KviStr::freeBuffer(ptr);
- }
- }
- }
- buffer.append(KviStr::Format,"%d",len);
- return true;
-}
-
-void KviScriptSocketObject::delayedFlush(unsigned int uTimeout)
-{
- if(m_pFlushTimer->isActive())m_pFlushTimer->stop();
- m_pFlushTimer->start(uTimeout);
-}
-
-void KviScriptSocketObject::tryFlush()
-{
- if(m_pFlushTimer->isActive())m_pFlushTimer->stop();
-
- if(m_pOutBuffer->size() == 0)
- {
- return;
- }
-
- int result = kvi_socket_send(m_sock,m_pOutBuffer->data(),m_pOutBuffer->size());
-
- if(result >= 0)
- {
- if(result == m_pOutBuffer->size())
- {
- m_pOutBuffer->clear();
- } else {
- if(result > 0)m_pOutBuffer->remove(result);
- delayedFlush(500);
- }
- } else {
- // Oops...error ?
- int err = kvi_socket_error();
-#ifdef COMPILE_ON_WINDOWS
- if((err == EAGAIN) || (err == EINTR) || (err = WSAEWOULDBLOCK))
-#else
- if((err == EAGAIN)||(err == EINTR))
-#endif
- {
- // Transient error...partial send as before...
- // Async continue...
- delayedFlush(500);
- return;
- } else {
- // Disconnected... :(
- unsigned int uOldConnectionId = m_uConnectionId;
- callEventFunction("disconnectEvent",0,new KviParameterList(
- new KviStr(KviError::getDescription(KviError::translateSystemError(err)))));
- if(m_uConnectionId == uOldConnectionId)reset();
- // else it has already been called!
- return;
- }
- }
-}
-
-*/
-//===========================================================================
KVSO_BEGIN_REGISTERCLASS(KviKvsObject_socket,"socket","object")
KVSO_REGISTER_HANDLER(KviKvsObject_socket,"status",functionStatus)
@@ -1273,7 +447,7 @@ bool KviKvsObject_socket::functionConnectTimeout(KviKvsObjectFunctionCall *c)
bool KviKvsObject_socket::functionSetConnectTimeout(KviKvsObjectFunctionCall *c)
{
- kvs_int_t uTimeout;
+ kvs_uint_t uTimeout;
KVSO_PARAMETERS_BEGIN(c)
KVSO_PARAMETER("time_out",KVS_PT_UNSIGNEDINTEGER,0,uTimeout)
KVSO_PARAMETERS_END(c)
@@ -1305,12 +479,6 @@ bool KviKvsObject_socket::functionLocalIp(KviKvsObjectFunctionCall *c)
return true;
}
-
-
-
-
-
-
bool KviKvsObject_socket::functionAccept(KviKvsObjectFunctionCall *c)
{
KviKvsObject * pObject;
@@ -1349,8 +517,6 @@ bool KviKvsObject_socket::functionAccept(KviKvsObjectFunctionCall *c)
-
-
bool KviKvsObject_socket::functionWriteHex(KviKvsObjectFunctionCall *c)
{
QString m_szHex;
@@ -1398,7 +564,6 @@ bool KviKvsObject_socket::functionWriteHex(KviKvsObjectFunctionCall *c)
bool KviKvsObject_socket::functionConnect(KviKvsObjectFunctionCall *c)
{
-
KVSO_PARAMETERS_BEGIN(c)
KVSO_PARAMETER("remote_ip",KVS_PT_STRING,0,m_szRemoteIp)
KVSO_PARAMETER("remote_port",KVS_PT_UNSIGNEDINTEGER,0,m_uRemotePort)
@@ -1452,7 +617,7 @@ bool KviKvsObject_socket::functionListen(KviKvsObjectFunctionCall *c)
c->returnValue()->setBoolean(false);
return true;
}
- kvs_int_t uLocalPort;
+ kvs_uint_t uLocalPort;
QString m_szLocalIp;
bool m_bIpV6;
KVSO_PARAMETERS_BEGIN(c)