00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <iostream>
00020 #include "qoscserver.h"
00021
00022 #include <QtCore/QRegExp>
00023 #include <QtNetwork/QUdpSocket>
00024
00025 QOscServer::QOscServer( quint16 port, QObject* p )
00026 : QOscBase( p )
00027 {
00028 socket()->bind( QHostAddress::Any, port );
00029 connect( socket(), SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
00030 }
00031 QOscServer::QOscServer( QHostAddress address, quint16 port, QObject* p )
00032 : QOscBase( p )
00033 {
00034 socket()->bind( address, port );
00035 connect( socket(), SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
00036 }
00037
00038 QOscServer::~QOscServer() {
00039 }
00040
00041 void QOscServer::registerPathObject( PathObject* p ) {
00042 paths.push_back( p );
00043 }
00044 void QOscServer::unregisterPathObject( PathObject* p ) {
00045 paths.removeAll( p );
00046 }
00047
00048 #define BUFFERSIZE 255
00049
00050 void QOscServer::readyRead() {
00051 while ( socket()->hasPendingDatagrams() ) {
00052 QByteArray packet( BUFFERSIZE, char( 0 ) );
00053 int size = socket()->readDatagram( packet.data(), BUFFERSIZE );
00054
00055 QString path;
00056 QString args;
00057 QVariant arguments;
00058
00059 int i=0;
00060 if ( packet[ i ] == '/' ) {
00061
00062 for ( ; i<size && packet[ i ] != char( 0 ); ++i )
00063 path += packet[ i ];
00064
00065 while ( packet[ i ] != ',' ) ++i;
00066 ++i;
00067 while ( packet[ i ] != char( 0 ) )
00068 args += packet[ i++ ];
00069
00070 if ( ! args.isEmpty() ) {
00071 QList<QVariant> list;
00072
00073 foreach( QChar type, args ) {
00074 while ( i%4 != 0 ) ++i;
00075
00076 QByteArray tmp = packet.right( packet.size()-i );
00077 QVariant value;
00078 if ( type == 's' ) {
00079 QString s = toString( tmp );
00080 value = s;
00081 i += s.size();
00082 }
00083 if ( type == 'i' ) {
00084 value = toInt32( tmp );
00085 i+=4;
00086 }
00087 if ( type == 'f' ) {
00088 value = toFloat( tmp );
00089 i+=4;
00090 }
00091
00092
00093 if ( args.size() > 1 )
00094 list.append( value );
00095 else
00096 arguments = value;
00097 }
00098
00099 if ( args.size() > 1 )
00100 arguments = list;
00101 }
00102 }
00103
00104 QMap<QString,QString> replacements;
00105 replacements[ "!" ] = "^";
00106 replacements[ "{" ] = "(";
00107 replacements[ "}" ] = ")";
00108 replacements[ "," ] = "|";
00109 replacements[ "*" ] = ".*";
00110 replacements[ "?" ] = ".";
00111
00112 foreach( QString rep, replacements.keys() )
00113 path.replace( rep, replacements[ rep ] );
00114
00115
00116 emit data(path, arguments);
00117
00118 QRegExp exp( path );
00119 foreach( PathObject* obj, paths ) {
00120 if ( exp.exactMatch( obj->_path ) )
00121 obj->signalData( arguments );
00122 }
00123 }
00124 }
00125