source: roaraudio/libroar/ctl.c @ 0:2a41d2f42394

Last change on this file since 0:2a41d2f42394 was 0:2a41d2f42394, checked in by phi, 16 years ago

Initial revision

File size: 5.0 KB
Line 
1//ctl.c:
2
3#include "libroar.h"
4
5int roar_server_oinfo   (struct roar_connection * con, struct roar_stream * sa) {
6 struct roar_message mes;
7
8 mes.cmd     = ROAR_CMD_SERVER_OINFO;
9 mes.datalen = 0;
10
11 if ( roar_req(con, &mes, NULL) == -1 )
12  return -1;
13
14 if ( mes.cmd != ROAR_CMD_OK )
15  return -1;
16
17 if ( roar_stream_m2s(sa, &mes) == -1 )
18  return -1;
19
20 return 0;
21}
22
23int roar_get_standby   (struct roar_connection * con) {
24 struct roar_message mes;
25
26 mes.cmd = ROAR_CMD_GET_STANDBY;
27 mes.datalen = 0;
28
29 if ( roar_req(con, &mes, NULL) == -1 )
30  return -1;
31
32 if ( mes.cmd != ROAR_CMD_OK )
33  return -1;
34
35 return ROAR_NET2HOST16(*((uint16_t*)mes.data));
36}
37
38int roar_set_standby   (struct roar_connection * con, int state) {
39 struct roar_message mes;
40
41 mes.cmd = ROAR_CMD_SET_STANDBY;
42 mes.datalen = 2;
43
44 *((uint16_t*)mes.data) = ROAR_HOST2NET16((unsigned) state);
45
46 if ( roar_req(con, &mes, NULL) == -1 )
47  return -1;
48
49 if ( mes.cmd != ROAR_CMD_OK )
50  return -1;
51
52 return 0;
53}
54
55int roar_exit   (struct roar_connection * con) {
56 struct roar_message mes;
57
58 mes.cmd = ROAR_CMD_EXIT;
59 mes.datalen = 0;
60 if ( roar_req(con, &mes, NULL) == -1 )
61  return -1;
62
63 if ( mes.cmd != ROAR_CMD_OK )
64  return -1;
65
66 return 0;
67}
68
69int roar_list         (struct roar_connection * con, int * items,   int max, int cmd) {
70 struct roar_message m;
71
72 roar_ctl_f2m_any(&m);
73 m.cmd = cmd;
74
75 if ( roar_req(con, &m, NULL) == -1 )
76  return -1;
77
78 return roar_ctl_m2ia(&m, items, max);
79}
80
81int roar_get_client   (struct roar_connection * con, struct roar_client * client, int id) {
82 struct roar_message m;
83
84 m.cmd     = ROAR_CMD_GET_CLIENT;
85 m.datalen = 1;
86 m.data[0] = id;
87
88 ROAR_DBG("roar_get_client(*): id = %i", id);
89
90 if ( roar_req(con, &m, NULL) == -1 )
91  return -1;
92
93 if ( m.cmd != ROAR_CMD_OK )
94  return -1;
95
96 ROAR_DBG("roar_get_client(*): got ok");
97
98 return roar_ctl_m2c(&m, client);
99}
100
101int roar_get_stream   (struct roar_connection * con, struct roar_stream * stream, int id) {
102 struct roar_message m;
103
104 m.cmd     = ROAR_CMD_GET_STREAM;
105 m.datalen = 1;
106 m.data[0] = id;
107
108 if ( roar_req(con, &m, NULL) == -1 )
109  return -1;
110
111 if ( m.cmd != ROAR_CMD_OK )
112  return -1;
113
114 return roar_stream_m2s(stream, &m);
115}
116
117int roar_kick         (struct roar_connection * con, int type, int id) {
118 struct roar_message m;
119 uint16_t * info = m.data;
120
121 m.cmd     = ROAR_CMD_KICK;
122 m.datalen = 4;
123 info[0] = type;
124 info[1] = id;
125
126 if ( roar_req(con, &m, NULL) == -1 )
127  return -1;
128
129 if ( m.cmd != ROAR_CMD_OK )
130  return -1;
131
132 return 0;
133}
134
135
136// converts: *_m2*, *_*2m
137
138int roar_ctl_f2m      (struct roar_message * m, unsigned char   filter, unsigned char   cmp, uint32_t   id) {
139
140 m->datalen = 7;
141
142 m->data[0] = 0;
143 m->data[1] = filter;
144 m->data[2] = cmp;
145 *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id);
146
147 return 0;
148}
149int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) {
150
151 if ( m->datalen != 7 )
152  return -1;
153
154 if ( m->data[0] != 0 ) {
155  ROAR_ERR("roar_ctl_m2f(*): version %i not supported!", m->data[0]);
156  return -1;
157 }
158
159 *filter = m->data[1];
160 *cmp    = m->data[2];
161
162 *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3])));
163
164 return 0;
165}
166
167int roar_ctl_ia2m     (struct roar_message * m, int * data, int len) {
168 int i;
169
170 if ( len > LIBROAR_BUFFER_MSGDATA )
171  return -1;
172
173 m->datalen = len;
174
175 for (i = 0; i < len; i++)
176  m->data[i] = data[i];
177
178 return 0;
179}
180int roar_ctl_m2ia     (struct roar_message * m, int * data, int len) {
181 int i;
182
183 if ( m->datalen > len )
184  return -1;
185
186 for (i = 0; i < m->datalen; i++)
187  data[i] = m->data[i];
188
189 return m->datalen;
190}
191
192int roar_ctl_c2m      (struct roar_message * m, struct roar_client * c) {
193 int cur = 0;
194 int h;
195 int i;
196 int max_len;
197
198 if ( c == NULL )
199  return -1;
200
201 m->data[cur++] = 0;                       // 0: Version
202 m->data[cur++] = c->execed;               // 1: execed
203
204 h = 0;
205 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {
206  if ( c->streams[i] != -1 )
207   m->data[cur+1+h++] = c->streams[i];
208 }
209
210 m->data[cur++] = h;                       // 2: num of streams
211 cur += h;
212
213 max_len = strlen(c->name);
214
215 // TODO: add some code to check if this fits in the pkg
216 // NOTE: add this code after we are sure how long this pkg will be
217 //       and fully decieded about this function.
218
219 m->data[cur++] = max_len;
220
221 strncpy((m->data)+cur, c->name, max_len);
222
223 cur += max_len;
224
225 m->datalen = cur;
226
227 return 0;
228}
229
230int roar_ctl_m2c      (struct roar_message * m, struct roar_client * c) {
231 int i;
232 int cur;
233
234 if ( m == NULL || c == NULL )
235  return -1;
236
237 if ( m->datalen == 0 )
238  return -1;
239
240 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen);
241
242 if ( m->data[0] != 0 ) {
243  ROAR_DBG("roar_ctl_m2c(*): wrong version!");
244  return -1;
245 }
246
247 if ( m->datalen < 3 )
248  return -1;
249
250 ROAR_DBG("roar_ctl_m2c(*): have usable data!");
251
252 c->execed = m->data[1];
253
254 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++)
255  c->streams[i] = -1;
256
257 for (i = 0; i < m->data[2]; i++)
258  c->streams[i] = m->data[3+i];
259
260 cur = 3 + m->data[2];
261
262 strncpy(c->name, (m->data)+cur+1, m->data[cur]);
263 c->name[m->data[cur]] = 0;
264
265 return 0;
266}
267
268//ll
Note: See TracBrowser for help on using the repository browser.