Changeset 4707:9f23480cf23e in roaraudio


Ignore:
Timestamp:
01/06/11 10:21:46 (11 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added menus for clients and streams, need to add support for placeholder based selectors for submenus

File:
1 edited

Legend:

Unmodified
Added
Removed
  • plugins/roard/protocol-gopher.c

    r4706 r4707  
    3535 
    3636static int scb_status_txt (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 
     37static int scb_clients    (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 
     38static int scb_streams    (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 
    3739 
    3840static struct roar_gopher_menu_item g_gopher_root_menu[] = { 
    3941 {.type = _INFO, .name = "roard Root Menu"}, 
    4042 {.type = _FILE, .name = "Server Info",   .selector = "/info.txt",   .host = NULL, .port = 0}, 
    41  {.type = _FILE, .name = "Server Status", .selector = "/status.txt", .host = NULL, .port = 0} 
     43 {.type = _FILE, .name = "Server Status", .selector = "/status.txt", .host = NULL, .port = 0}, 
     44 {.type = _DIR,  .name = "Clients",       .selector = "/clients/",   .host = NULL, .port = 0}, 
     45 {.type = _DIR,  .name = "Streams",       .selector = "/streams/",   .host = NULL, .port = 0}, 
    4246}; 
    4347 
     
    6165 }, 
    6266 {.selector = "/info.txt",   .type = _FILE, .text = "Some\nText.", .cb = NULL}, 
    63  {.selector = "/status.txt", .type = _FILE, .cb = scb_status_txt} 
     67 {.selector = "/status.txt", .type = _FILE, .cb = scb_status_txt}, 
     68 {.selector = "/clients/",   .type = _DIR,  .cb = scb_clients}, 
     69 {.selector = "/streams/",   .type = _DIR,  .cb = scb_streams} 
    6470}; 
     71 
     72static int send_menu (int client, struct roar_gopher_menu * menu, struct roar_vio_calls * vio); 
     73static int send_text (int client, const char * text, struct roar_vio_calls * vio); 
    6574 
    6675 
     
    99108} 
    100109 
     110static int scb_clients    (int client, struct roar_vio_calls * vio, const char * selector, char ** text) { 
     111 struct roar_gopher_menu_item items[ROAR_CLIENTS_MAX]; 
     112 struct roar_gopher_menu menu = {.flags = 0, .items = items, .items_len = 0}; 
     113 struct roar_gopher_menu_item * item; 
     114 struct roar_client_server * cs; 
     115 struct roar_client        * c; 
     116 const size_t len = 80; 
     117 char * d; 
     118 size_t i; 
     119 int ret; 
     120 
     121 memset(items, 0, sizeof(items)); 
     122 
     123 for (i = 0; i < ROAR_CLIENTS_MAX; i++) { 
     124  if ( (c = ROAR_CLIENT((cs = g_clients[i]))) != NULL ) { 
     125   item = &(items[menu.items_len++]); 
     126   item->type = _DIR; 
     127   d = roar_mm_malloc(len); 
     128   if ( d == NULL ) { 
     129    menu.items_len--; 
     130    continue; 
     131   } 
     132   if ( c->name != NULL && c->name[0] != 0 ) { 
     133    snprintf(d, len, "Client %i: %s", (int)i, c->name); 
     134   } else { 
     135    snprintf(d, len, "Client %i", (int)i); 
     136   } 
     137   item->name = d; 
     138 
     139   d = roar_mm_malloc(len); 
     140   if ( d == NULL ) { 
     141    if ( item->name != NULL ) 
     142     roar_mm_free((void*)item->name); 
     143    menu.items_len--; 
     144    continue; 
     145   } 
     146 
     147   snprintf(d, len, "/clients/%i/", (int)i); 
     148   item->selector = d; 
     149  } 
     150 } 
     151 
     152 ret = send_menu(client, &menu, vio); 
     153 
     154 for (i = 0; i < menu.items_len; i++) { 
     155  if ( items[i].name != NULL ) 
     156   roar_mm_free((void*)items[i].name); 
     157  if ( items[i].selector != NULL ) 
     158   roar_mm_free((void*)items[i].selector); 
     159 } 
     160 
     161 return ret; 
     162} 
     163 
     164static int scb_streams    (int client, struct roar_vio_calls * vio, const char * selector, char ** text) { 
     165 struct roar_gopher_menu_item items[ROAR_STREAMS_MAX]; 
     166 struct roar_gopher_menu menu = {.flags = 0, .items = items, .items_len = 0}; 
     167 struct roar_gopher_menu_item * item; 
     168 struct roar_stream_server * ss; 
     169 struct roar_stream        * s; 
     170 const size_t len = 80; 
     171 char * d; 
     172 size_t i; 
     173 int ret; 
     174 
     175 memset(items, 0, sizeof(items)); 
     176 
     177 for (i = 0; i < ROAR_STREAMS_MAX; i++) { 
     178  if ( (s = ROAR_STREAM((ss = g_streams[i]))) != NULL ) { 
     179   item = &(items[menu.items_len++]); 
     180   item->type = _DIR; 
     181   d = roar_mm_malloc(len); 
     182   if ( d == NULL ) { 
     183    menu.items_len--; 
     184    continue; 
     185   } 
     186   if ( ss->name != NULL && ss->name[0] != 0 ) { 
     187    snprintf(d, len, "Stream %i: %s", (int)i, ss->name); 
     188   } else { 
     189    snprintf(d, len, "Stream %i", (int)i); 
     190   } 
     191   item->name = d; 
     192 
     193   d = roar_mm_malloc(len); 
     194   if ( d == NULL ) { 
     195    if ( item->name != NULL ) 
     196     roar_mm_free((void*)item->name); 
     197    menu.items_len--; 
     198    continue; 
     199   } 
     200 
     201   snprintf(d, len, "/streams/%i/", (int)i); 
     202   item->selector = d; 
     203  } 
     204 } 
     205 
     206 ret = send_menu(client, &menu, vio); 
     207 
     208 for (i = 0; i < menu.items_len; i++) { 
     209  if ( items[i].name != NULL ) 
     210   roar_mm_free((void*)items[i].name); 
     211  if ( items[i].selector != NULL ) 
     212   roar_mm_free((void*)items[i].selector); 
     213 } 
     214 
     215 return ret; 
     216} 
    101217 
    102218// other code: 
Note: See TracChangeset for help on using the changeset viewer.