00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "qosctypes.h"
00020 #include "qoscserver.h"
00021 #include "qoscclient.h"
00022
00023 #include <QtCore/QByteArray>
00024 #include <QtCore/QString>
00025 #include <QtNetwork/QUdpSocket>
00026
00027 QOscBase::QOscBase( QObject* p )
00028 : QObject( p )
00029 , _socket( 0 )
00030 {
00031 setSocket( 0 );
00032 }
00033
00034 void QOscBase::setSocket( QUdpSocket* s ) {
00035 if ( _socket ) {
00036 delete _socket;
00037 _socket = 0;
00038 }
00039
00040 if ( !_socket ) {
00041 if ( s )
00042 _socket = s;
00043 else
00044 _socket = new QUdpSocket( this );
00045 }
00046 }
00047 QUdpSocket* QOscBase::socket() const { return _socket; }
00048
00049 void QOscBase::fillQByteArrayUp( QByteArray& in ) {
00050 while ( in.length() % 4 != 0 )
00051 in.append( char( 0 ) );
00052 }
00053
00054 QByteArray QOscBase::reverseQByteArray( QByteArray in ) {
00055 QByteArray out;
00056 for ( int i=0; i<in.size(); ++i )
00057 out.prepend( in[ i ] );
00058 return out;
00059 }
00060
00061 QByteArray QOscBase::fromString( QString str ) {
00062 QByteArray out = str.toUtf8();
00063 out.append( char( 0 ) );
00064 while ( out.length() % 4 != 0 )
00065 out.append( char( 0 ) );
00066 return out;
00067 }
00068 QByteArray QOscBase::fromInt32( qint32 i ) {
00069 QByteArray tmp( ( char* )static_cast<void*>( &i ), 4 );
00070 return reverseQByteArray( tmp );
00071 }
00072 QByteArray QOscBase::fromFloat( float f ) {
00073 QByteArray tmp( ( char* )static_cast<void*>( &f ), 4 );
00074 return reverseQByteArray( tmp );
00075 }
00076 QString QOscBase::toString( const QByteArray& b ) {
00077 return QString( b.data() );
00078 }
00079 qint32 QOscBase::toInt32( const QByteArray& b ) {
00080 QByteArray tmp = b.left( 4 );
00081 tmp = reverseQByteArray( tmp );
00082 qint32* ret = ( qint32* )static_cast<void*>( tmp.data() );
00083 return *ret;
00084 }
00085 float QOscBase::toFloat( const QByteArray& b ) {
00086 QByteArray tmp = b.left( 4 );
00087 tmp = reverseQByteArray( tmp );
00088 float* ret = ( float* )static_cast<void*>( tmp.data() );
00089 return *ret;
00090 }
00091
00092 void QOscBase::oscMessageParseArgs( const QVariant& data, QString& argtypes, QByteArray& arguments ) {
00093 if ( data.type() == QVariant::Int ) {
00094 argtypes += "i";
00095 arguments = arguments + fromInt32( data.toInt() );
00096 }
00097 if ( data.type() == QVariant::Double ) {
00098 argtypes += "f";
00099 arguments += fromFloat( data.toDouble() );
00100 }
00101 if ( data.type() == QVariant::String ) {
00102 argtypes += "s";
00103 arguments += fromString( data.toString() );
00104 }
00105 if ( data.type() == QVariant::List ) {
00106 QList<QVariant> list = data.toList();
00107 foreach( QVariant v, list )
00108 oscMessageParseArgs( v, argtypes, arguments );
00109 }
00110 }
00111
00112 QByteArray QOscBase::oscMessage( QString path, QVariant arg ) {
00113 QString argtypes( "," );
00114 QByteArray arguments;
00115
00116 oscMessageParseArgs( arg, argtypes, arguments );
00117
00118 QByteArray out = fromString( path );
00119 out.append( fromString( argtypes ) );
00120 out.append( arguments );
00121 return out;
00122 }
00123
00124
00125 PathObject::PathObject( QString path, QVariant::Type type, QOscClient* parent )
00126 : QObject( parent )
00127 , _path( path )
00128 , _type( type )
00129 , _client( parent )
00130 , _server( 0 )
00131 {
00132 }
00133 PathObject::PathObject( QString path, QVariant::Type type, QOscServer* parent )
00134 : QObject( parent )
00135 , _path( path )
00136 , _type( type )
00137 , _client( 0 )
00138 , _server( parent )
00139 {
00140 _server->registerPathObject( this );
00141 }
00142 PathObject::~PathObject() {
00143 if ( _server )
00144 _server->unregisterPathObject( this );
00145 }
00146
00147 void PathObject::send( QVariant v ) {
00148 if ( v.type() == _type && _client )
00149 _client->sendData( _path, v );
00150 }
00151 void PathObject::send( int i ) { send( QVariant( i ) ); }
00152 void PathObject::send( QString s ) { send( QVariant( s ) ); }
00153 void PathObject::send( double d ) { send( QVariant( d ) ); }
00154 void PathObject::send() { send( QVariant() ); }
00155
00156 void PathObject::signalData( QVariant v ) {
00157 if ( v.canConvert( _type ) ) {
00158 v.convert(_type);
00159 if ( _type == QVariant::Invalid )
00160 {
00161 emit data();
00162 }
00163 if ( _type == QVariant::Int )
00164 {
00165 emit data( v.toInt() );
00166 }
00167 if ( _type == QVariant::Double )
00168 {
00169 emit data( v.toDouble() );
00170 }
00171 if ( _type == QVariant::String )
00172 {
00173 emit data( v.toString() );
00174 }
00175 emit data( v );
00176 }
00177 }
00178