example_server.c
/*
* Copyright (C) 2014 Steve Harris et al. (see AUTHORS)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* $Id$
*/
#include <stdio.h>
#include <stdlib.h>
#ifndef WIN32
# include <unistd.h>
#endif
#include "lo/lo.h"
int done = 0;
void error(int num, const char *m, const char *path);
int generic_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data);
int foo_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data);
int blobtest_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data);
int pattern_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data);
int quit_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data);
int main()
{
/* start a new server on port 7770 */
lo_server_thread st = lo_server_thread_new("7770", error);
/* add method that will match any path and args */
lo_server_thread_add_method(st, NULL, NULL, generic_handler, NULL);
/* add method that will match the path /foo/bar, with two numbers, coerced
* to float and int */
lo_server_thread_add_method(st, "/foo/bar", "fi", foo_handler, NULL);
/* add method that will match the path /blobtest with one blob arg */
lo_server_thread_add_method(st, "/blobtest", "b", blobtest_handler, NULL);
/* catch any message starting with /g using a pattern method */
lo_server_thread_add_method(st, "/p*", "", pattern_handler, NULL);
/* also catch "/q*", but glob_handle returns 1, so quit_handler
* gets called after */
lo_server_thread_add_method(st, "/q*", "", pattern_handler, NULL);
/* add method that will match the path /quit with no args */
lo_server_thread_add_method(st, "/quit", "", quit_handler, NULL);
lo_server_thread_start(st);
while (!done) {
#ifdef WIN32
Sleep(1);
#else
usleep(1000);
#endif
}
lo_server_thread_free(st);
return 0;
}
void error(int num, const char *msg, const char *path)
{
printf("liblo server error %d in path %s: %s\n", num, path, msg);
fflush(stdout);
}
/* catch any incoming messages and display them. returning 1 means that the
* message has not been fully handled and the server should try other methods */
int generic_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data)
{
int i;
printf("generic handler; path: <%s>\n", path);
for (i = 0; i < argc; i++) {
printf("arg %d '%c' ", i, types[i]);
lo_arg_pp((lo_type)types[i], argv[i]);
printf("\n");
}
printf("\n");
fflush(stdout);
return 1;
}
int foo_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data)
{
/* example showing pulling the argument values out of the argv array */
printf("foo: %s <- f:%f, i:%d\n\n", path, argv[0]->f, argv[1]->i);
fflush(stdout);
return 0;
}
int blobtest_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data)
{
/* example showing how to get data for a blob */
int i, size = argv[0]->blob.size;
char mydata[6];
unsigned char *blobdata = (unsigned char*)lo_blob_dataptr((lo_blob)argv[0]);
int blobsize = lo_blob_datasize((lo_blob)argv[0]);
/* Alternatively:
* blobdata = &argv[0]->blob.data;
* blobsize = argv[0]->blob.size;
*/
/* Don't trust network input! Blob can be anything, so check if
each character is a letter A-Z. */
for (i=0; i<6 && i<blobsize; i++)
if (blobdata[i] >= 'A' && blobdata[i] <= 'Z')
mydata[i] = blobdata[i];
else
mydata[i] = '.';
mydata[5] = 0;
printf("%s <- length:%d '%s'\n", path, size, mydata);
fflush(stdout);
return 0;
}
int pattern_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data)
{
printf("pattern handler matched: %s\n\n", path);
fflush(stdout);
// Let the dispatcher continue by returning non-zero, so
// quit_handler can also catch the message
return 1;
}
int quit_handler(const char *path, const char *types, lo_arg ** argv,
int argc, lo_message data, void *user_data)
{
done = 1;
printf("quiting\n\n");
fflush(stdout);
return 0;
}
/* vi:set ts=8 sts=4 sw=4: */
lo_type
lo_type
An enumeration of the OSC types liblo can send and receive.
Definition lo_osc_types.h:61
lo_blob_datasize
uint32_t lo_blob_datasize(lo_blob b)
Return the amount of valid data in a lo_blob object.
lo_blob_dataptr
void * lo_blob_dataptr(lo_blob b)
Return a pointer to the start of the blob data to allow contents to be changed.
lo_arg_pp
void lo_arg_pp(lo_type type, void *data)
Pretty-print a set of typed arguments.
lo.h
lo_server_thread_start
int lo_server_thread_start(lo_server_thread st)
Start the server thread.
lo_server_thread_new
lo_server_thread lo_server_thread_new(const char *port, lo_err_handler err_h)
Create a new server thread to handle incoming OSC messages.
lo_server_thread_free
void lo_server_thread_free(lo_server_thread st)
Free memory taken by a server thread.
lo_server_thread_add_method
lo_method lo_server_thread_add_method(lo_server_thread st, const char *path, const char *typespec, lo_method_handler h, const void *user_data)
Add an OSC method to the specifed server thread.
lo_message
struct lo_message_ * lo_message
A low-level object used to represent messages passed over OSC.
Definition lo_types.h:60
lo_blob
struct lo_blob_ * lo_blob
A object to store an opaque binary data object.
Definition lo_types.h:52
lo_server_thread
struct lo_server_thread_ * lo_server_thread
An object representing a thread containing an OSC server.
Definition lo_types.h:92
lo_arg
Union used to read values from incoming messages.
Definition lo_osc_types.h:104
lo_arg::blob
struct lo_arg::@226103027130072103152162042157376001107262333041 blob