diff options
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/objects/class_socket.cpp | 138 |
1 files changed, 58 insertions, 80 deletions
diff --git a/src/modules/objects/class_socket.cpp b/src/modules/objects/class_socket.cpp index 6866a5efe..1d8098efe 100644 --- a/src/modules/objects/class_socket.cpp +++ b/src/modules/objects/class_socket.cpp @@ -155,18 +155,16 @@ By default this function can deal ascii data only: NULL characters are transformed to ASCII characters 255. You can pass a [class]memorybuffer[/class] object to read binary data. - !fn: $write(<data, array,files or hobject>[,length]) Writes <data> to the socket.[br] This function can deal with binary data passing a [class]memorybuffer[/class] object[br] Please note that when this function finishes it does not mean that the data has reached the remote end.[br] Basically it does not even mean that the data has been sent to the remote host.[br] The data is enqueued for sending and will be sent as soon as possible.[br] - By array you can pass bytes or data string like this: @$write($array($(0xff),$(0xff),$(0xff),$(0xff),"This is an example")); + Using an array you can pass bytes or data string like this: @$write($array($(0xff),$(0xff),$(0xff),$(0xff),"This is an example")); If you're going to [cmd]delete[/cmd] this object just after the $write call, you should call [classfnc:socket]$close[/classfnc]() just before [cmd]delete[/cmd] to ensure the data delivery. - !fn: $close() Resets this socket state: kills any pending or active connection. After a close() call the socket may be used for a new connection.[br] @@ -330,7 +328,7 @@ KVSO_END_DESTRUCTOR(KviKvsObject_socket) KVSO_CLASS_FUNCTION(socket,status) { - c->returnValue()->setInteger(m_iStatus); + c->returnValue()->setInteger(m_iStatus); return true; } @@ -409,20 +407,19 @@ KVSO_CLASS_FUNCTION(socket,read) if (hObject) { pObject=KviKvsKernel::instance()->objectController()->lookupObject(hObject); - if (!pObject) + if(!pObject) { c->warning(__tr2qs_ctx("Buffer parameter is not an object","objects")); return true; } - if (pObject->inheritsClass("memorybuffer")) + if(pObject->inheritsClass("memorybuffer")) { QByteArray *pBuffer=((KviKvsObject_memorybuffer *)pObject)->pBuffer(); int oldsize=pBuffer->size(); pBuffer->resize(oldsize+uLen); kvi_memmove(pBuffer->data()+oldsize,m_pInBuffer,uLen); - } - else if (pObject->inheritsClass("file")) + } else if(pObject->inheritsClass("file")) { KviFile *pFile=((KviKvsObject_file *)pObject)->file(); if (!pFile->isOpen()) @@ -431,8 +428,7 @@ KVSO_CLASS_FUNCTION(socket,read) return true; } pFile->write(m_pInBuffer,uLen); - } - else + } else { c->warning(__tr2qs_ctx("Buffer parameter is not a memorybuffer object","objects")); return true; @@ -464,87 +460,75 @@ KVSO_CLASS_FUNCTION(socket,write) KviKvsVariant * pVariantData; kvs_hobject_t hObject; KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("data_or_file_or_memorybuffer",KVS_PT_VARIANT,0,pVariantData) - KVSO_PARAMETER("length",KVS_PT_UNSIGNEDINTEGER,KVS_PF_OPTIONAL,uLen) + KVSO_PARAMETER("data_or_file_or_memorybuffer",KVS_PT_VARIANT,0,pVariantData) + KVSO_PARAMETER("length",KVS_PT_UNSIGNEDINTEGER,KVS_PF_OPTIONAL,uLen) KVSO_PARAMETERS_END(c) if (pVariantData->isHObject()) { pVariantData->asHObject(hObject); - pObject=KviKvsKernel::instance()->objectController()->lookupObject(hObject); - if (!pObject) + pObject = KviKvsKernel::instance()->objectController()->lookupObject(hObject); + if(!pObject) { c->warning(__tr2qs_ctx("Buffer parameter is not an object","objects")); return true; } - if (pObject->inheritsClass("memorybuffer")) + if(pObject->inheritsClass("memorybuffer")) { QByteArray *p=((KviKvsObject_memorybuffer *)pObject)->pBuffer(); - m_pOutBuffer->append((const unsigned char*)p->data(),p->size()); - } - else if (pObject->inheritsClass("file")) + m_pOutBuffer->append((const unsigned char *)p->data(),p->size()); + } else if(pObject->inheritsClass("file")) { - KviFile *pFile=((KviKvsObject_file *)pObject)->file(); - if (!pFile->isOpen()) + KviFile * pFile = ((KviKvsObject_file *)pObject)->file(); + if(!pFile->isOpen()) { c->warning(__tr2qs_ctx("File is not open!","objects")); return true; } - if (!uLen) uLen=pFile->size(); - kvs_int_t size=pFile->size(); + if(!uLen) + uLen = pFile->size(); + kvs_int_t size = pFile->size(); pFile->flush(); m_pOutBuffer->append((const unsigned char*)pFile->read(uLen).data(),uLen); c->returnValue()->setBoolean((size-pFile->pos()==0)); + } else { + c->warning(__tr2qs_ctx("Buffer parameter is not a memorybuffer or file object","objects")); + return true; } - else + } else { + if(pVariantData->isArray()) { - c->warning(__tr2qs_ctx("Buffer parameter is not a memorybuffer or file object","objects")); + KviKvsArray * pArray = pVariantData->array(); + for(unsigned int i=0; i < pArray->size(); i++) + { + KviKvsVariant * pVar = pArray->at(i); + kvs_int_t iValue; + if(pVar->isInteger()) + { + pVar->asInteger(iValue); + if(iValue < 256 && iValue >= 0) + { + m_pOutBuffer->append((unsigned char)iValue); + continue; + } else { + c->warning(__tr2qs_ctx("Only values in the range of 0-255 are allowed: integer %d is out of range","objects"),iValue); + return true; + } + } else { + if(pVar->isString()) + { + QString szData; + pVar->asString(szData); + QByteArray szData8 = szData.toUtf8(); + m_pOutBuffer->append((const unsigned char*)szData8.data(),szData8.length()); + } else { + c->warning(__tr2qs_ctx("Datatype not supported","objects")); + return true; + } + } + } return true; } - } - else - { - if(pVariantData->isArray()) - { - KviKvsArray *pArray=pVariantData->array(); - for(unsigned int i=0;i<pArray->size();i++) - { - KviKvsVariant *pVar=pArray->at(i); - kvs_int_t iValue; - if(pVar->isInteger()) - { - pVar->asInteger(iValue); - if(iValue<256 && iValue>=0) - { - m_pOutBuffer->append((unsigned char)iValue); - continue; - } - else - { - c->warning(__tr2qs_ctx("Only values in the range of 0-255 are hallowed: integer %d is out of range","objects"),iValue); - return true; - } - - } - else{ - if(pVar->isString()) - { - QString szData; - pVar->asString(szData); - QByteArray szData8 = szData.toUtf8(); - m_pOutBuffer->append((const unsigned char*)szData8.data(),szData8.length()); - } - else - { - c->warning(__tr2qs_ctx("Datatype not supported","objects")); - return true; - } - } - - } - return true; - } - QString szData; pVariantData->asString(szData); if(!KviFileUtils::fileExists(szData)) @@ -552,12 +536,10 @@ KVSO_CLASS_FUNCTION(socket,write) QByteArray szData8 = szData.toUtf8(); if(szData8.length() > 0) { - qDebug("write on socket %s",szData8.data()); - m_pOutBuffer->append((const unsigned char*)szData8.data(),szData8.length()); + qDebug("write on socket %s",szData8.data()); + m_pOutBuffer->append((const unsigned char*)szData8.data(),szData8.length()); } - } - else - { + } else { KviFile f(szData); f.open(QIODevice::ReadOnly); QByteArray ar= f.readAll(); @@ -614,11 +596,9 @@ KVSO_CLASS_FUNCTION(socket,setProtocol) KVSO_PARAMETERS_END(c) m_bUdp = KviQString::equalCI(szProto,"udp"); - return true; + return true; } - - KVSO_CLASS_FUNCTION(socket,functionConnect) { KVSO_PARAMETERS_BEGIN(c) @@ -627,7 +607,6 @@ KVSO_CLASS_FUNCTION(socket,functionConnect) KVSO_PARAMETERS_END(c) qDebug("Function connect"); - if (m_uRemotePort>65535) { c->warning(__tr2qs_ctx("Value %d for port is out of range (values allowed are from 0 to 65535)","objects"),m_uRemotePort); @@ -648,7 +627,7 @@ KVSO_CLASS_FUNCTION(socket,functionConnect) #endif { qDebug("ok connecting"); - qDebug("connecting on ip %s ",m_szRemoteIp.toUtf8().data()); + qDebug("connecting to ip %s ",m_szRemoteIp.toUtf8().data()); qDebug("no ip"); m_iStatus = KVI_SCRIPT_SOCKET_STATUS_CONNECTING; delayedConnect(); @@ -719,7 +698,7 @@ KVSO_CLASS_FUNCTION(socket,listen) #ifdef COMPILE_IPV6_SUPPORT m_sock = kvi_socket_create(m_bIPv6 ? KVI_SOCKET_PF_INET6 : KVI_SOCKET_PF_INET, - m_bUdp ? KVI_SOCKET_TYPE_DGRAM : KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP); + m_bUdp ? KVI_SOCKET_TYPE_DGRAM : KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP); #else m_sock = kvi_socket_create(KVI_SOCKET_PF_INET,m_bUdp ? KVI_SOCKET_TYPE_DGRAM : KVI_SOCKET_TYPE_STREAM,KVI_SOCKET_PROTO_TCP); #endif @@ -777,7 +756,6 @@ KVSO_CLASS_FUNCTION(socket,listen) } } - if(!kvi_socket_listen(m_sock,5)) { c->warning(__tr2qs_ctx("Listen failure","objects")); |
