Changeset 4343:a67cbb88fbe0 in roaraudio


Ignore:
Timestamp:
09/13/10 21:58:14 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for wait command

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r4311 r4343  
    77        * Added a lot const keywords 
    88        * Added notify framework (process internal signals) 
     9        * Added support for WAIT command 
    910 
    1011v. 0.3 - Sun Aug 22 2010 26:14 CEST 
  • roard/clients.c

    r4326 r4343  
    8484    } 
    8585 
     86    ns->blockc   = 0; 
     87    ns->waits    = NULL; 
     88 
    8689    g_clients[i] = ns; 
    8790 
     
    277280 return 0; 
    278281} 
     282 
     283int 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 
    279295 
    280296#define MAX_STREAMLESS 8 
     
    491507    ROAR_DBG("clients_check(*): data=%p", data); 
    492508 
    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); 
    494511 
    495512    if ( flags[1] & COMMAND_FLAG_OUT_CLOSECON ) 
     
    727744} 
    728745 
     746 
     747// notify thingys 
     748int 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 
     790void 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 
    729827//ll 
  • roard/commands.c

    r4298 r4343  
    7373  {ROAR_CMD_BEEP,         _NAME("BEEP"),         req_on_beep}, 
    7474 
     75  {ROAR_CMD_WAIT,         _NAME("WAIT"),         req_on_wait}, 
     76 
    7577  {ROAR_CMD_EOL,          _NAME("END OF LIST"),  NULL} 
    7678 }; 
  • roard/include/client.h

    r4326 r4343  
    4747*/ 
    4848 
     49struct roar_client_nsubscribe { 
     50 struct roar_subscriber * sub; 
     51}; 
     52 
    4953struct roar_client_server { 
    5054 struct roar_client _client; 
     55 size_t blockc; 
     56 struct roar_subscriber ** waits; 
    5157} * g_clients[ROAR_CLIENTS_MAX]; 
    5258 
    5359 
    5460// basic functions 
    55  
    5661int clients_init       (void); 
    5762int clients_free       (void); 
     
    6974int clients_get_fh     (int id); 
    7075 
     76int clients_block      (int id, int unblock); 
     77 
    7178// network functions 
    7279int clients_check_all  (void); 
     
    7683 
    7784// stream functions 
    78  
    79  
    8085int client_stream_exec   (int client, int stream); 
    8186int client_stream_set_fh (int client, int stream, int fh); 
     
    8489int client_stream_move   (int client, int stream); 
    8590 
     91// notify thingys 
     92int  clients_wait    (int client, struct roar_event * events, size_t num); 
     93void clients_ncb_wait(struct roar_notify_core * core, struct roar_event * event, void * userdata); 
     94 
    8695#endif 
    8796 
  • roard/include/commands.h

    r4297 r4343  
    3535#define COMMAND_FLAG_OUT_CLOSECON  0x00000001 
    3636#define COMMAND_FLAG_OUT_LONGDATA  0x00000002 
     37#define COMMAND_FLAG_OUT_NOSEND    0x00000004 
    3738 
    3839struct roar_command { 
  • roard/include/req.h

    r3926 r4343  
    7373int req_on_beep        (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 
    7474 
     75int req_on_wait        (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 
     76 
    7577//int req_on_ (int client, struct roar_message * mes, char ** data, uint32_t flags[2]); 
    7678 
  • roard/req.c

    r4333 r4343  
    13511351} 
    13521352 
     1353int 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 
    13531395//ll 
Note: See TracChangeset for help on using the changeset viewer.