LMMS
Loading...
Searching...
No Matches
ports.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 Mark McCurry
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
30
31#ifndef RTOSC_PORTS
32#define RTOSC_PORTS
33
34#include <vector>
35#include <functional>
36#include <initializer_list>
37#include <rtosc/rtosc.h>
38#include <rtosc/rtosc-version.h>
39#include <cstring>
40#include <cctype>
41#include <cstdlib>
42#include <cstdio>
43#include <string>
44
45namespace rtosc {
46
47//First define all types
48typedef const char *msg_t;
49
50struct Port;
51struct Ports;
52
54struct RtData
55{
56 RtData(void);
57
63 char *loc;
64 size_t loc_size;
65 void *obj;
66 int matches;
67 const Port *port;
70 const char *message;
71
72 int idx[16];
73 void push_index(int ind);
74 void pop_index(void);
75
76 virtual void replyArray(const char *path, const char *args,
77 rtosc_arg_t *vals);
78 virtual void reply(const char *path, const char *args, ...);
80 virtual void reply(const char *msg);
81 virtual void chain(const char *path, const char *args, ...);
83 virtual void chain(const char *msg);
84 virtual void chainArray(const char *path, const char *args,
85 rtosc_arg_t *vals);
87 virtual void broadcast(const char *path, const char *args, ...);
88 virtual void broadcast(const char *msg);
89 virtual void broadcastArray(const char *path, const char *args,
90 rtosc_arg_t *vals);
91
92 virtual void forward(const char *rational=NULL);
93};
94
95
99struct Port {
100 const char *name;
101 const char *metadata;
102 const Ports *ports;
103 std::function<void(msg_t, RtData&)> cb;
104
106 {
107 public:
108 MetaIterator(const char *str);
109
110 //A bit odd to return yourself, but it seems to work for this
111 //context
112 const MetaIterator& operator*(void) const {return *this;}
113 const MetaIterator* operator->(void) const {return this;}
114 bool operator==(MetaIterator a) {return title == a.title;}
115 bool operator!=(MetaIterator a) {return title != a.title;}
117 operator bool() const;
118
119 const char *title;
120 const char *value;
121 };
122
124 {
125 public:
126 MetaContainer(const char *str_);
127
128 MetaIterator begin(void) const;
129 MetaIterator end(void) const;
130
131 MetaIterator find(const char *str) const;
132 size_t length(void) const;
135 const char *operator[](const char *str) const;
136
137 const char *str_ptr;
138 };
139
140 MetaContainer meta(void) const
141 {
142 if(metadata && *metadata == ':')
143 return MetaContainer(metadata+1);
144 else
145 return MetaContainer(metadata);
146 }
147
148};
149
160struct Ports
161{
162 std::vector<Port> ports;
163 std::function<void(msg_t, RtData&)> default_handler;
164
165 typedef std::vector<Port>::const_iterator itr_t;
166
168 itr_t begin() const {return ports.begin();}
169
171 itr_t end() const {return ports.end();}
172
174 size_t size() const {return ports.size();}
175
177 const Port &operator[](unsigned i) const {return ports[i];}
178
179 Ports(std::initializer_list<Port> l);
180 ~Ports(void);
181
182 Ports(const Ports&) = delete;
183
196 void dispatch(const char *m, RtData &d, bool base_dispatch=false) const;
197
202 const Port *operator[](const char *name) const;
203
204
222 const Port *apropos(const char *path) const;
223
229 static char *collapsePath(char *p);
230
231 protected:
232 void refreshMagic(void);
233 private:
234 //Performance hacks
236 unsigned elms;
237};
238
240{
241 const char *name;
242 std::function<void(msg_t, RtData&)> cb;
243};
244
245struct ClonePorts:public Ports
246{
247 ClonePorts(const Ports &p,
248 std::initializer_list<ClonePort> c);
249};
250
251struct MergePorts:public Ports
252{
253 MergePorts(std::initializer_list<const Ports*> c);
254};
255
265const char* get_default_value(const char* port_name, const Ports& ports,
266 void* runtime, const Port* port_hint = NULL,
267 int32_t idx = -1, int recursive = 1);
268
294int get_default_value(const char* port_name, const char *port_args,
295 const Ports& ports,
296 void* runtime, const Port* port_hint,
297 int32_t idx,
298 size_t n, rtosc_arg_val_t* res,
299 char *strbuf, size_t strbufsize);
300
301
311std::string get_changed_values(const Ports& ports, void* runtime);
312
317{
318 const Ports* ports;
319 void* runtime;
320 char loc[1024];
321
322protected:
323 enum proceed {
324 abort = -2,
326 };
327
333
338
340 void operator()(const char* msg);
341
342 static int default_response(size_t nargs, bool first_round,
343 dependency_t dependency);
344
345private:
348 virtual int on_dispatch(size_t portname_max, char* portname,
349 size_t maxargs, size_t nargs,
350 rtosc_arg_val_t* args,
351 bool round2, dependency_t dependency);
352
353 friend int dispatch_printed_messages(const char* messages,
354 const Ports& ports, void* runtime,
356
357 friend int load_from_file(const char* file_content,
358 const Ports& ports, void* runtime,
359 const char* appname,
360 rtosc_version appver,
362};
363
375int dispatch_printed_messages(const char* messages,
376 const Ports& ports, void* runtime,
378
387std::string save_to_file(const Ports& ports, void* runtime,
388 const char* appname, rtosc_version appver);
389
402int load_from_file(const char* file_content,
403 const Ports& ports, void* runtime,
404 const char* appname,
405 rtosc_version appver,
407
424 const char* port_args, Port::MetaContainer meta);
425
432void map_arg_vals(rtosc_arg_val_t* av, size_t n,
434
435/*********************
436 * Port walking code *
437 *********************/
438//typedef std::function<void(const Port*,const char*)> port_walker_t;
452typedef void(*port_walker_t)(const Port*,const char*,const char*,
453 const Ports&,void*,void*);
454
464void walk_ports(const Ports *base,
465 char *name_buffer,
466 size_t buffer_size,
467 void *data,
468 port_walker_t walker,
469 void *runtime = NULL);
470
478int enum_key(Port::MetaContainer meta, const char* value);
479
480/*********************
481 * Port Dumping code *
482 *********************/
483
485{
486 const Ports *p;
487 std::string prog_name;
488 std::string uri;
489 std::string doc_origin;
490 std::string author_first;
491 std::string author_last;
492 //TODO extend this some more
493};
494
495std::ostream &operator<<(std::ostream &o, OscDocFormatter &formatter);
496};
497#endif
#define NULL
Definition CarlaBridgeFormat.cpp:30
uint8_t a
Definition Spc_Cpu.h:141
static intptr_t dispatcher(NativeHostHandle h, NativeHostDispatcherOpcode c, int32_t i, intptr_t v, void *p, float o)
Definition carla-host-plugin.c:48
Definition ports.h:124
const char * str_ptr
Definition ports.h:137
MetaContainer(const char *str_)
Definition ports.cpp:172
size_t length(void) const
Definition ports.cpp:197
MetaIterator end(void) const
Definition ports.cpp:184
const char * operator[](const char *str) const
Definition ports.cpp:208
MetaIterator begin(void) const
Definition ports.cpp:176
MetaIterator find(const char *str) const
Definition ports.cpp:189
Definition ports.h:106
const MetaIterator * operator->(void) const
Definition ports.h:113
MetaIterator & operator++(void)
Definition ports.cpp:146
bool operator!=(MetaIterator a)
Definition ports.h:115
bool operator==(MetaIterator a)
Definition ports.h:114
const MetaIterator & operator*(void) const
Definition ports.h:112
const char * value
Definition ports.h:120
const char * title
Definition ports.h:119
MetaIterator(const char *str)
Definition ports.cpp:140
Definition ports.cpp:253
Definition ports.h:317
friend int load_from_file(const char *file_content, const Ports &ports, void *runtime, const char *appname, rtosc_version appver, savefile_dispatcher_t *dispatcher)
static int default_response(size_t nargs, bool first_round, dependency_t dependency)
Definition ports.cpp:1137
proceed
Definition ports.h:323
@ abort
the message shall lead to abort the savefile loading
Definition ports.h:324
@ discard
the message shall not be dispatched
Definition ports.h:325
void operator()(const char *msg)
call this to dispatch a message
Definition ports.cpp:1127
virtual int on_dispatch(size_t portname_max, char *portname, size_t maxargs, size_t nargs, rtosc_arg_val_t *args, bool round2, dependency_t dependency)
Definition ports.cpp:1152
rtosc_version app_filever
app version savefile was written with
Definition ports.h:336
rtosc_version app_curver
current app version
Definition ports.h:337
rtosc_version rtosc_filever
rtosc versinon savefile was written with
Definition ports.h:334
dependency_t
Definition ports.h:328
@ no_dependencies
Definition ports.h:329
@ not_specified
default values do depend on others
Definition ports.h:331
@ has_dependencies
default values don't depend on others
Definition ports.h:330
rtosc_version rtosc_curver
rtosc version of this library
Definition ports.h:335
friend int dispatch_printed_messages(const char *messages, const Ports &ports, void *runtime, savefile_dispatcher_t *dispatcher)
const Ports * ports
Definition ports.h:318
void * runtime
Definition ports.h:319
char loc[1024]
Definition ports.h:320
int * l
Definition inflate.c:1579
unsigned * m
Definition inflate.c:1559
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
JSAMPIMAGE data
Definition jpeglib.h:945
int int32_t
Definition mid.cpp:97
const char * msg
Definition missing_descriptor.c:20
Definition globals.h:37
const char * msg_t
Definition ports.h:48
int enum_key(Port::MetaContainer meta, const char *value)
Definition ports.cpp:1809
void map_arg_vals(rtosc_arg_val_t *av, size_t n, Port::MetaContainer meta)
Definition ports.cpp:974
std::string get_changed_values(const Ports &ports, void *runtime)
Definition ports.cpp:1029
void(* port_walker_t)(const Port *, const char *, const char *, const Ports &, void *, void *)
Definition ports.h:452
std::ostream & operator<<(std::ostream &o, OscDocFormatter &formatter)
Definition ports.cpp:2013
int canonicalize_arg_vals(rtosc_arg_val_t *av, size_t n, const char *port_args, Port::MetaContainer meta)
Definition ports.cpp:939
int dispatch_printed_messages(const char *messages, const Ports &ports, void *runtime, savefile_dispatcher_t *dispatcher=NULL)
Definition ports.cpp:1161
std::string save_to_file(const Ports &ports, void *runtime, const char *appname, rtosc_version appver)
Definition ports.cpp:1253
int load_from_file(const char *file_content, const Ports &ports, void *runtime, const char *appname, rtosc_version appver, savefile_dispatcher_t *dispatcher=NULL)
Definition ports.cpp:1272
const char * get_default_value(const char *port_name, const Ports &ports, void *runtime, const Port *port_hint=NULL, int32_t idx=-1, int recursive=1)
Definition ports.cpp:853
void walk_ports(const Ports *base, char *name_buffer, size_t buffer_size, void *data, port_walker_t walker, void *runtime=NULL)
Definition ports.cpp:1570
Definition ports.h:240
const char * name
Definition ports.h:241
std::function< void(msg_t, RtData &)> cb
Definition ports.h:242
ClonePorts(const Ports &p, std::initializer_list< ClonePort > c)
Definition ports.cpp:1446
MergePorts(std::initializer_list< const Ports * > c)
Definition ports.cpp:1470
Definition ports.h:485
std::string author_first
Definition ports.h:490
const Ports * p
Definition ports.h:486
std::string author_last
Definition ports.h:491
std::string prog_name
Definition ports.h:487
std::string doc_origin
Definition ports.h:489
std::string uri
Definition ports.h:488
Definition ports.h:99
MetaContainer meta(void) const
Definition ports.h:140
const char * metadata
Statically accessable data about port.
Definition ports.h:101
const char * name
Pattern for messages to match.
Definition ports.h:100
std::function< void(msg_t, RtData &)> cb
Callback for matching functions.
Definition ports.h:103
const Ports * ports
Pointer to further ports.
Definition ports.h:102
Definition ports.h:161
~Ports(void)
Definition ports.cpp:507
std::function< void(msg_t, RtData &)> default_handler
Definition ports.h:163
Ports(std::initializer_list< Port > l)
Definition ports.cpp:501
const Port & operator[](unsigned i) const
Definition ports.h:177
unsigned elms
Definition ports.h:236
itr_t end() const
Definition ports.h:171
std::vector< Port >::const_iterator itr_t
Definition ports.h:165
static char * collapsePath(char *p)
Definition ports.cpp:1401
void dispatch(const char *m, RtData &d, bool base_dispatch=false) const
Definition ports.cpp:517
std::vector< Port > ports
Definition ports.h:162
class Port_Matcher * impl
Definition ports.h:235
void refreshMagic(void)
Definition ports.cpp:1432
itr_t begin() const
Definition ports.h:168
const Port * apropos(const char *path) const
Definition ports.cpp:1348
Ports(const Ports &)=delete
size_t size() const
Definition ports.h:174
data object for the dispatch routine
Definition ports.h:55
const Port * port
Definition ports.h:67
int matches
number of matches returned from dispatch routine
Definition ports.h:66
char * loc
Definition ports.h:63
virtual void replyArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:64
virtual void reply(const char *path, const char *args,...)
Definition ports.cpp:71
virtual void broadcast(const char *path, const char *args,...)
Transmit initialization/change of a value to all listeners.
Definition ports.cpp:99
virtual void broadcastArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:110
virtual void chainArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:92
virtual void forward(const char *rational=NULL)
Definition ports.cpp:118
RtData(void)
Definition ports.cpp:42
void push_index(int ind)
Definition ports.cpp:49
size_t loc_size
Definition ports.h:64
void * obj
runtime object to dispatch this object to
Definition ports.h:65
void pop_index(void)
Definition ports.cpp:56
int idx[16]
Definition ports.h:72
virtual void chain(const char *path, const char *args,...)
Definition ports.cpp:82
const char * message
Will be set to point to the full OSC message in case of a base dispatch.
Definition ports.h:70
Definition rtosc.h:127
struct containing an rtosc version
Definition rtosc-version.h:40
Definition rtosc.h:46
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
#define void
Definition unzip.h:396