Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 81 additions & 81 deletions libofqf/qoscserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "qoscserver.h"

#include <QtCore/QDebug>
#include <QtCore/QRegExp>
#include <QRegularExpression>
#include <QtNetwork/QUdpSocket>

QOscServer::QOscServer( quint16 port, QObject* p )
Expand All @@ -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 );
}

Expand All @@ -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<size; ++i )
// qDebug() << i << "\t" << static_cast<quint8*>( static_cast<void*>( data.data() ) )[ i ];
QString path;
QString args;
QVariant arguments;

int i=0;
if ( data[ i ] == '/' ) {

for ( ; i<size && data[ i ] != char( 0 ); ++i )
path += data[ i ];

while ( data[ i ] != ',' ) ++i;
++i;
while ( data[ i ] != char( 0 ) )
args += data[ i++ ];

if ( ! args.isEmpty() ) {
QList<QVariant> 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<QString,QString> 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<QVariant> 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<QString, QString> 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);
}
}
}