rt_size_t douban_radio_read(struct douban_radio* douban, char *buffer, rt_size_t length) { rt_size_t rx_length; char* ptr; if (douban->current >= douban->size) { douban_radio_playlist_load(douban); printf("wrong\n"); return 0; } ptr = buffer; while (length > 32) //why > 32? { if (douban->session == 0) { /* create a http session */ // rt_kprintf("open session url[%d]: %s\n", douban->current, // douban->items[douban->current].url); douban->session = http_session_open(douban->items[douban->current].url); //printf("I am here\n"); if (douban->session == 0) { /* can't open this link */ douban->current ++; // rt_kprintf("open session failed, move to %d\n", douban->current); if (douban->current >= douban->size) { douban_radio_playlist_load(douban); break; } } } /* read http client data */ rx_length = http_session_read(douban->session, ptr, length); //printf("read data from the mp3 http_session\n"); if (rx_length <= 0) { /* close this session */ http_session_close(douban->session); douban->session = 0; douban->current ++; // rt_kprintf("close session, move to %d\n", douban->current); if (douban->current >= douban->size) { douban_radio_playlist_load(douban); break; } } else { ptr += rx_length; length -= rx_length; } } return ptr - buffer; }
int douban_radio_playlist_load(struct douban_radio* douban) { rt_uint32_t index; rt_size_t length; char *buffer, *url; char *ptr; struct http_session* session; for (index = 0; index < douban->size; index ++) { free(douban->items[index].artist); free(douban->items[index].title); free(douban->items[index].url); free(douban->items[index].picture); } url = (char*)malloc(URL_SIZE); snprintf(url, URL_SIZE,DOUBAN_RADIO_URL_CHANNEL, douban->channel); //在linux下面没有sprintf_s这个,但是可以用snprintf替代,参数都不用改 session = http_session_open(url); if (session == 0) goto __exit; buffer =(char*)malloc(session->size); ptr = buffer; do { length = http_session_read(session, ptr, buffer + session->size - ptr); if (length <= 0) break; ptr += length; } while (ptr < buffer + session->size); length = ptr - buffer; printf("total %d bytes\n", (int)length); http_session_close(session); session = 0; /* parse douban song list */ douban->current = douban->size = 0; douban_radio_parse(douban, buffer, length); return 0; __exit: //if (buffer != 0) free(buffer); if (url != 0) free(url); //if (session != 0) http_session_close(session); return -1; }
void http_test(char* url) { struct http_session* session; char buffer[80]; rt_size_t length; session = http_session_open(url); if (session == RT_NULL) { rt_kprintf("open http session failed\n"); return; } do { rt_memset(buffer, 0, sizeof(buffer)); length = http_session_read(session, (rt_uint8_t*)buffer, sizeof(buffer)); rt_kprintf(buffer);rt_kprintf("\n"); } while (length > 0); http_session_close(session); }