LMMS
Loading...
Searching...
No Matches
subtree-serialize.cpp
Go to the documentation of this file.
2#include <rtosc/ports.h>
3#include <rtosc/rtosc.h>
4#include <cstring>
5#include <cassert>
6
7
8using namespace rtosc;
9
10static void emplace_uint32_cpp(uint8_t *buffer, uint32_t d)
11{
12 buffer[0] = ((d>>24) & 0xff);
13 buffer[1] = ((d>>16) & 0xff);
14 buffer[2] = ((d>>8) & 0xff);
15 buffer[3] = ((d>>0) & 0xff);
16}
17
18/*
19 * Append another message onto a bundle if the space permits it.
20 * If insufficient space is available, then zero is returned and the buffer is
21 * untouched.
22 *
23 * If this is useful it may be generalized to rtosc_bundle_append()
24 */
25static size_t append_bundle(char *dst, const char *src,
26 size_t max_len, size_t dst_len, size_t src_len)
27{
28 assert(rtosc_message_length(src,src_len) == src_len);
29
30 //Handle Edge case alignment
31 //if(rtosc_bundle_elements(dst, dst_len) == 0)
32 // dst_len -= 4;
33
34
35 if(max_len < dst_len + src_len + 4 || dst_len == 0 || src_len == 0)
36 return 0;
37 emplace_uint32_cpp((uint8_t*)(dst+dst_len), src_len);
38
39 memcpy(dst+dst_len+4, src, src_len);
40
41 return dst_len + src_len + 4;
42}
43
44//This object captures the output of any given port by calling it through a no
45//argument message
46//Assuming that the loc field is set correctly the message stored here will be
47//able to be replayed to get an object to a previous state
48class VarCapture : public RtData
49{
50 public:
51 char buf[128];
52 char location[128];
53 char msg[128];
54 const char *dummy;
55 bool success;
56
58 :dummy("/ser\0\0\0\0,\0\0\0")
59 {
60 memset(buf, 0, sizeof(buf));
61 memset(location, 0, sizeof(buf));
62 this->loc = location;
63 success = false;
64 }
65
66 const char *capture(const Ports *p, const char *path, void *obj_)
67 {
68 this->loc = location;
69 assert(this->loc == location);
70 this->obj = obj_;
71 location[0] = '/';
72 strcpy(location+1, path);
73 success = false;
74 size_t len = rtosc_message(msg, 128, path, "");
75 (void) len;
76 assert(len);
77 assert(!strchr(path, ':'));
78
79 p->dispatch(msg, *this);
80 return success ? buf : NULL;
81 }
82
83 virtual void reply(const char *path, const char *args, ...)
84 {
86 assert(*path);
87 va_list va;
88 va_start(va, args);
89 size_t len = rtosc_vmessage(buf, 128, path, args, va);
90 (void) len;
91 assert(len != 0);
92 success = true;
93 va_end(va);
94 }
95 virtual void broadcast(const char *msg)
96 {
97 (void) msg;
98 }
99};
100
110
111size_t subtree_serialize(char *buffer, size_t buffer_size,
112 void *object, rtosc::Ports *ports)
113{
114 (void) object;
115 assert(buffer);
116 assert(ports);
117
118 subtree_args_t args;
119 args.v.obj = object;
120 args.len = rtosc_bundle(buffer, buffer_size, 0xdeadbeef0a0b0c0dULL, 0);
121 args.buffer = buffer;
122 args.buffer_size = buffer_size;
123 args.object = object;
124 args.ports = ports;
125
126
127 //TODO FIXME this is not currently RT safe at the moment
128 walk_ports(ports, args.v.loc, 128, &args, [](const Port *p, const char *,
129 const char*,
130 const Ports&, void *dat,
131 void*) {
132 if(p->meta().find("internal") != p->meta().end())
133 return;
134
135 subtree_args_t *args = (subtree_args_t*) dat;
136
137 const char *buf = args->vv.capture(args->ports, args->v.loc+1, args->object);
138 if(buf)
139 args->len = append_bundle(args->buffer, buf, args->buffer_size, args->len,
140 rtosc_message_length(buf, 128));
141 });
142
143 return args.len;
144}
145
146void subtree_deserialize(char *buffer, size_t buffer_size,
147 void *object, rtosc::Ports *ports, RtData &d)
148{
149 d.obj = object;
150 //simply replay all objects seen here
151 for(unsigned i=0; i<rtosc_bundle_elements(buffer, buffer_size); ++i) {
152 const char *msg = rtosc_bundle_fetch(buffer, i);
153 ports->dispatch(msg+1, d);
154 }
155}
#define NULL
Definition CarlaBridgeFormat.cpp:30
assert(0)
Definition subtree-serialize.cpp:49
char location[128]
Definition subtree-serialize.cpp:52
virtual void broadcast(const char *msg)
Definition subtree-serialize.cpp:95
VarCapture(void)
Definition subtree-serialize.cpp:57
bool success
Definition subtree-serialize.cpp:55
virtual void reply(const char *path, const char *args,...)
Definition subtree-serialize.cpp:83
const char * capture(const Ports *p, const char *path, void *obj_)
Definition subtree-serialize.cpp:66
char msg[128]
Definition subtree-serialize.cpp:53
const char * dummy
Definition subtree-serialize.cpp:54
char buf[128]
Definition subtree-serialize.cpp:51
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
void * object
Definition jmemsys.h:50
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
const char * msg
Definition missing_descriptor.c:20
Definition globals.h:37
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
size_t rtosc_message_length(const char *msg, size_t len)
Definition rtosc.c:848
size_t rtosc_vmessage(char *buffer, size_t len, const char *address, const char *arguments, va_list ap)
Definition rtosc.c:497
size_t rtosc_bundle(char *buffer, size_t len, uint64_t tt, int elms,...)
Definition rtosc.c:931
const char * rtosc_bundle_fetch(const char *buffer, unsigned elm)
Definition rtosc.c:972
size_t rtosc_message(char *buffer, size_t len, const char *address, const char *arguments,...)
Definition rtosc.c:161
size_t rtosc_bundle_elements(const char *buffer, size_t len)
Definition rtosc.c:957
Definition lv2apply.c:40
Definition ports.h:161
void dispatch(const char *m, RtData &d, bool base_dispatch=false) const
Definition ports.cpp:517
data object for the dispatch routine
Definition ports.h:55
char * loc
Definition ports.h:63
RtData(void)
Definition ports.cpp:42
void * obj
runtime object to dispatch this object to
Definition ports.h:65
Definition subtree-serialize.cpp:102
size_t len
Definition subtree-serialize.cpp:104
char * buffer
Definition subtree-serialize.cpp:105
size_t buffer_size
Definition subtree-serialize.cpp:106
void * object
Definition subtree-serialize.cpp:107
rtosc::Ports * ports
Definition subtree-serialize.cpp:108
VarCapture v
Definition subtree-serialize.cpp:103
VarCapture vv
Definition subtree-serialize.cpp:103
static void emplace_uint32_cpp(uint8_t *buffer, uint32_t d)
Definition subtree-serialize.cpp:10
void subtree_deserialize(char *buffer, size_t buffer_size, void *object, rtosc::Ports *ports, RtData &d)
Definition subtree-serialize.cpp:146
static size_t append_bundle(char *dst, const char *src, size_t max_len, size_t dst_len, size_t src_len)
Definition subtree-serialize.cpp:25
size_t subtree_serialize(char *buffer, size_t buffer_size, void *object, rtosc::Ports *ports)
Definition subtree-serialize.cpp:111
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
#define void
Definition unzip.h:396