diff options
| author | 2007-01-23 16:31:02 +0000 | |
|---|---|---|
| committer | 2007-01-23 16:31:02 +0000 | |
| commit | 52c050dd0ff72f7399cb1bd743d20c7d447e094b (patch) | |
| tree | 157dff75036a7d72df47787ad3eeebc5a095944e /src/modules/objects/class_socket.cpp | |
| parent | added seenserv command (diff) | |
| download | KVIrc-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.cpp | 839 |
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) |
