tomwalters@570: /* tomwalters@570: Example of two different ways to process received OSC messages using oscpack. tomwalters@570: Receives the messages from the SimpleSend.cpp example. tomwalters@570: */ tomwalters@570: tomwalters@570: #include tomwalters@570: tomwalters@570: #include "osc/OscReceivedElements.h" tomwalters@570: #include "osc/OscPacketListener.h" tomwalters@570: #include "ip/UdpSocket.h" tomwalters@570: tomwalters@570: tomwalters@570: #define PORT 7000 tomwalters@570: tomwalters@570: class ExamplePacketListener : public osc::OscPacketListener { tomwalters@570: protected: tomwalters@570: tomwalters@570: virtual void ProcessMessage( const osc::ReceivedMessage& m, tomwalters@570: const IpEndpointName& remoteEndpoint ) tomwalters@570: { tomwalters@570: try{ tomwalters@570: // example of parsing single messages. osc::OsckPacketListener tomwalters@570: // handles the bundle traversal. tomwalters@570: tomwalters@570: if( strcmp( m.AddressPattern(), "/test1" ) == 0 ){ tomwalters@570: // example #1 -- argument stream interface tomwalters@570: osc::ReceivedMessageArgumentStream args = m.ArgumentStream(); tomwalters@570: bool a1; tomwalters@570: osc::int32 a2; tomwalters@570: float a3; tomwalters@570: const char *a4; tomwalters@570: args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage; tomwalters@570: tomwalters@570: std::cout << "received '/test1' message with arguments: " tomwalters@570: << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; tomwalters@570: tomwalters@570: }else if( strcmp( m.AddressPattern(), "/test2" ) == 0 ){ tomwalters@570: // example #2 -- argument iterator interface, supports tomwalters@570: // reflection for overloaded messages (eg you can call tomwalters@570: // (*arg)->IsBool() to check if a bool was passed etc). tomwalters@570: osc::ReceivedMessage::const_iterator arg = m.ArgumentsBegin(); tomwalters@570: bool a1 = (arg++)->AsBool(); tomwalters@570: int a2 = (arg++)->AsInt32(); tomwalters@570: float a3 = (arg++)->AsFloat(); tomwalters@570: const char *a4 = (arg++)->AsString(); tomwalters@570: if( arg != m.ArgumentsEnd() ) tomwalters@570: throw osc::ExcessArgumentException(); tomwalters@570: tomwalters@570: std::cout << "received '/test2' message with arguments: " tomwalters@570: << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; tomwalters@570: } tomwalters@570: }catch( osc::Exception& e ){ tomwalters@570: // any parsing errors such as unexpected argument types, or tomwalters@570: // missing arguments get thrown as exceptions. tomwalters@570: std::cout << "error while parsing message: " tomwalters@570: << m.AddressPattern() << ": " << e.what() << "\n"; tomwalters@570: } tomwalters@570: } tomwalters@570: }; tomwalters@570: tomwalters@570: int main(int argc, char* argv[]) tomwalters@570: { tomwalters@570: ExamplePacketListener listener; tomwalters@570: UdpListeningReceiveSocket s( tomwalters@570: IpEndpointName( IpEndpointName::ANY_ADDRESS, PORT ), tomwalters@570: &listener ); tomwalters@570: tomwalters@570: std::cout << "press ctrl-c to end\n"; tomwalters@570: tomwalters@570: s.RunUntilSigInt(); tomwalters@570: tomwalters@570: return 0; tomwalters@570: } tomwalters@570: