Changeset 4343:a67cbb88fbe0 in roaraudio
- Timestamp:
- 09/13/10 21:58:14 (14 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r4311 r4343 7 7 * Added a lot const keywords 8 8 * Added notify framework (process internal signals) 9 * Added support for WAIT command 9 10 10 11 v. 0.3 - Sun Aug 22 2010 26:14 CEST -
roard/clients.c
r4326 r4343 84 84 } 85 85 86 ns->blockc = 0; 87 ns->waits = NULL; 88 86 89 g_clients[i] = ns; 87 90 … … 277 280 return 0; 278 281 } 282 283 int clients_block (int id, int unblock) { 284 _CHECK_CID(id); 285 286 if ( unblock ) { 287 g_clients[id]->blockc--; 288 } else { 289 g_clients[id]->blockc++; 290 } 291 292 return 0; 293 } 294 279 295 280 296 #define MAX_STREAMLESS 8 … … 491 507 ROAR_DBG("clients_check(*): data=%p", data); 492 508 493 roar_send_message(&con, &m, flags[1] & COMMAND_FLAG_OUT_LONGDATA ? data : NULL); 509 if ( !(flags[1] & COMMAND_FLAG_OUT_NOSEND) ) 510 roar_send_message(&con, &m, flags[1] & COMMAND_FLAG_OUT_LONGDATA ? data : NULL); 494 511 495 512 if ( flags[1] & COMMAND_FLAG_OUT_CLOSECON ) … … 727 744 } 728 745 746 747 // notify thingys 748 int clients_wait (int client, struct roar_event * events, size_t num) { 749 struct roar_client_server * cs; 750 size_t i, c; 751 752 ROAR_DBG("clients_wait(client=%i, events=%p, num=%llu) = ?", client, events, (long long unsigned int)num); 753 754 _CHECK_CID(client); 755 756 cs = g_clients[client]; 757 758 if ( cs->waits != NULL ) 759 return -1; 760 761 cs->waits = roar_mm_malloc((num+1) * sizeof(struct roar_subscriber *)); 762 763 if ( cs->waits == NULL ) 764 return -1; 765 766 if ( clients_block(client, 0) != 0 ) 767 return -1; 768 769 for (i = 0; i < num; i++) { 770 #if defined(DEBUG) && 0 771 dbg_notify_cb(NULL, &(events[i]), cs); 772 #endif 773 cs->waits[i] = roar_notify_core_subscribe(NULL, &(events[i]), clients_ncb_wait, cs); 774 if ( cs->waits[i] == NULL ) { 775 for (c = 0; c < i; c++) 776 roar_notify_core_unsubscribe(NULL, cs->waits[c]); 777 roar_mm_free(cs->waits); 778 cs->waits = NULL; 779 clients_block(client, 1); 780 return -1; 781 } 782 } 783 784 cs->waits[num] = NULL; 785 786 ROAR_DBG("clients_wait(client=%i, events=%p, num=%llu) = 0", client, events, (long long unsigned int)num); 787 return 0; 788 } 789 790 void clients_ncb_wait(struct roar_notify_core * core, struct roar_event * event, void * userdata) { 791 struct roar_client_server * cs = userdata; 792 struct roar_message m; 793 struct roar_connection con; 794 uint16_t * u16 = (uint16_t *) m.data; 795 size_t tmp; 796 size_t i; 797 798 ROAR_DBG("clients_ncb_wait(core=%p, event=%p, userdata=%p) = ?", core, event, userdata); 799 800 for (i = 0; cs->waits[i] != NULL; i++) 801 roar_notify_core_unsubscribe(NULL, cs->waits[i]); 802 803 roar_mm_free(cs->waits); 804 cs->waits = NULL; 805 806 // protocol depended handling... 807 memset(&m, 0, sizeof(m)); 808 m.cmd = ROAR_CMD_OK; 809 u16[0] = ROAR_HOST2NET16(0); // Version 810 u16[1] = ROAR_HOST2NET16(0); // flags 811 812 tmp = sizeof(m.data) - 4; 813 814 roar_event_to_blob(event, m.data + 4, &tmp); 815 816 m.datalen = tmp + 4; 817 818 roar_connect_fh(&con, ROAR_CLIENT(cs)->fh); 819 roar_send_message(&con, &m, NULL); 820 // ...end of protocol depended handling. 821 822 // clients_block(, 1); 823 // TODO: FIXME: bad hack... 824 cs->blockc--; 825 } 826 729 827 //ll -
roard/commands.c
r4298 r4343 73 73 {ROAR_CMD_BEEP, _NAME("BEEP"), req_on_beep}, 74 74 75 {ROAR_CMD_WAIT, _NAME("WAIT"), req_on_wait}, 76 75 77 {ROAR_CMD_EOL, _NAME("END OF LIST"), NULL} 76 78 }; -
roard/include/client.h
r4326 r4343 47 47 */ 48 48 49 struct roar_client_nsubscribe { 50 struct roar_subscriber * sub; 51 }; 52 49 53 struct roar_client_server { 50 54 struct roar_client _client; 55 size_t blockc; 56 struct roar_subscriber ** waits; 51 57 } * g_clients[ROAR_CLIENTS_MAX]; 52 58 53 59 54 60 // basic functions 55 56 61 int clients_init (void); 57 62 int clients_free (void); … … 69 74 int clients_get_fh (int id); 70 75 76 int clients_block (int id, int unblock); 77 71 78 // network functions 72 79 int clients_check_all (void); … … 76 83 77 84 // stream functions 78 79 80 85 int client_stream_exec (int client, int stream); 81 86 int client_stream_set_fh (int client, int stream, int fh); … … 84 89 int client_stream_move (int client, int stream); 85 90 91 // notify thingys 92 int clients_wait (int client, struct roar_event * events, size_t num); 93 void clients_ncb_wait(struct roar_notify_core * core, struct roar_event * event, void * userdata); 94 86 95 #endif 87 96 -
roard/include/commands.h
r4297 r4343 35 35 #define COMMAND_FLAG_OUT_CLOSECON 0x00000001 36 36 #define COMMAND_FLAG_OUT_LONGDATA 0x00000002 37 #define COMMAND_FLAG_OUT_NOSEND 0x00000004 37 38 38 39 struct roar_command { -
roard/include/req.h
r3926 r4343 73 73 int req_on_beep (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 74 74 75 int req_on_wait (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 76 75 77 //int req_on_ (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 76 78 -
roard/req.c
r4333 r4343 1351 1351 } 1352 1352 1353 int req_on_wait (int client, struct roar_message * mes, char ** data, uint32_t flags[2]) { 1354 uint16_t * u16 = (uint16_t*)mes->data; 1355 struct roar_event events[4]; 1356 size_t left, tmp; 1357 size_t num = 0; 1358 void * vp = mes->data; 1359 1360 vp += 4; 1361 1362 // check for complet header... 1363 if ( mes->datalen < 4 ) 1364 return -1; 1365 1366 u16[0] = ROAR_NET2HOST16(u16[0]); 1367 u16[1] = ROAR_NET2HOST16(u16[1]); 1368 1369 // do we support version and flags? 1370 if ( u16[0] != 0 || u16[1] != 0 ) 1371 return -1; 1372 1373 memset(events, 0, sizeof(events)); 1374 1375 left = mes->datalen - 4; 1376 1377 while (left) { 1378 tmp = left; 1379 if ( roar_event_from_blob(&(events[num]), vp, &tmp) == -1 ) 1380 return -1; 1381 1382 vp += tmp; 1383 left -= tmp; 1384 num++; 1385 } 1386 1387 if ( clients_wait(client, events, num) == -1 ) 1388 return -1; 1389 1390 flags[1] |= COMMAND_FLAG_OUT_NOSEND; 1391 1392 return 0; 1393 } 1394 1353 1395 //ll
Note: See TracChangeset
for help on using the changeset viewer.