diff --git a/libofqf/qoscserver.cpp b/libofqf/qoscserver.cpp index eaf65e4..a7ba079 100644 --- a/libofqf/qoscserver.cpp +++ b/libofqf/qoscserver.cpp @@ -19,7 +19,7 @@ #include "qoscserver.h" #include -#include +#include #include QOscServer::QOscServer( quint16 port, QObject* p ) @@ -33,7 +33,7 @@ QOscServer::QOscServer( quint16 port, QObject* p ) QOscServer::QOscServer( QHostAddress address, quint16 port, QObject* p ) : QOscBase( p ) { - qDebug() << "QOscServer::QOscServer(" << address << "," << port << "," << p << ")"; + qDebug() << "QOscServer::QOscServer(" << address << "," << port << "," << p << ")"; socket()->bind( address, port ); } @@ -51,84 +51,84 @@ void QOscServer::unregisterPathObject( PathObject* p ) { #define BUFFERSIZE 255 void QOscServer::readyRead() { - qDebug() << "QOscServer::readyRead()"; - while ( socket()->hasPendingDatagrams() ) { - QByteArray data( BUFFERSIZE, char( 0 ) ); - //data.resize( BUFFERSIZE ); - int size = socket()->readDatagram( data.data(), BUFFERSIZE ); - qDebug() << " read" << size << "(" << data.size() << ") bytes:" << data; - - //for ( int i=0; i( static_cast( data.data() ) )[ i ]; - QString path; - QString args; - QVariant arguments; - - int i=0; - if ( data[ i ] == '/' ) { - - for ( ; i list; - - foreach( QChar type, args ) { - while ( i%4 != 0 ) ++i; - //qDebug() << i << "\ttrying to convert to" << type; - - QByteArray tmp = data.right( data.size()-i ); - QVariant value; - if ( type == 's' ) { - QString s = toString( tmp ); - value = s; - i += s.size(); - } - if ( type == 'i' ) { - value = toInt32( tmp ); - i+=4; - } - if ( type == 'f' ) { - value = toFloat( tmp ); - i+=4; - } - //qDebug() << " got" << value; - - if ( args.size() > 1 ) - list.append( value ); - else - arguments = value; - } - - if ( args.size() > 1 ) - arguments = list; - } - } - qDebug() << "path seems to be" << path << "args are" << args << ":" << arguments; - - QMap replacements; - replacements[ "!" ] = "^"; - replacements[ "{" ] = "("; - replacements[ "}" ] = ")"; - replacements[ "," ] = "|"; - replacements[ "*" ] = ".*"; - replacements[ "?" ] = "."; - - foreach( QString rep, replacements.keys() ) - path.replace( rep, replacements[ rep ] ); - - qDebug() << " after transformation to OSC-RegExp path is" << path; - - QRegExp exp( path ); - foreach( PathObject* obj, paths ) { - if ( exp.exactMatch( obj->_path ) ) - obj->signalData( arguments ); - } - } + qDebug() << "QOscServer::readyRead()"; + + while (socket()->hasPendingDatagrams()) { + QByteArray data(BUFFERSIZE, char(0)); + int size = socket()->readDatagram(data.data(), BUFFERSIZE); + qDebug() << " read" << size << "(" << data.size() << ") bytes:" << data; + + QString path; + QString args; + QVariant arguments; + + int i = 0; + if (data[i] == '/') { + + for (; i < size && data[i] != char(0); ++i) + path += data[i]; + + while (i < size && data[i] != ',') ++i; + ++i; // skip comma + while (i < size && data[i] != char(0)) + args += data[i++]; + + if (!args.isEmpty()) { + QList list; + + foreach (QChar type, args) { + while (i % 4 != 0) ++i; + + QByteArray tmp = data.mid(i); + QVariant value; + if (type == 's') { + QString s = toString(tmp); + value = s; + i += s.size(); + } + else if (type == 'i') { + value = toInt32(tmp); + i += 4; + } + else if (type == 'f') { + value = toFloat(tmp); + i += 4; + } + + if (args.size() > 1) + list.append(value); + else + arguments = value; + } + + if (args.size() > 1) + arguments = list; + } + } + + qDebug() << "path seems to be" << path << "args are" << args << ":" << arguments; + + // convert OSC-style path to regex + QMap replacements; + replacements["!"] = "^"; + replacements["{"] = "("; + replacements["}"] = ")"; + replacements[","] = "|"; + replacements["*"] = ".*"; + replacements["?"] = "."; + + foreach (QString rep, replacements.keys()) + path.replace(rep, replacements[rep]); + + qDebug() << " after transformation to OSC-RegExp path is" << path; + + QRegularExpression exp(path); + + foreach (PathObject* obj, paths) { + QRegularExpressionMatch match = exp.match(obj->_path); + if (match.hasMatch() && match.captured(0) == obj->_path) + obj->signalData(arguments); + } + } }