Changeset 4343:a67cbb88fbe0 in roaraudio for roard/clients.c


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

added support for wait command

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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 
Note: See TracChangeset for help on using the changeset viewer.