Changeset 4707:9f23480cf23e in roaraudio
- Timestamp:
- 01/06/11 10:21:46 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/roard/protocol-gopher.c
r4706 r4707 35 35 36 36 static int scb_status_txt (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 37 static int scb_clients (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 38 static int scb_streams (int client, struct roar_vio_calls * vio, const char * selector, char ** text); 37 39 38 40 static struct roar_gopher_menu_item g_gopher_root_menu[] = { 39 41 {.type = _INFO, .name = "roard Root Menu"}, 40 42 {.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}, 42 46 }; 43 47 … … 61 65 }, 62 66 {.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} 64 70 }; 71 72 static int send_menu (int client, struct roar_gopher_menu * menu, struct roar_vio_calls * vio); 73 static int send_text (int client, const char * text, struct roar_vio_calls * vio); 65 74 66 75 … … 99 108 } 100 109 110 static 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 164 static 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 } 101 217 102 218 // other code:
Note: See TracChangeset
for help on using the changeset viewer.