Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}