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;
}
Exemple #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);
}
Exemple #4
0
/************
发送图片
*************/
int send_jpg(int uart_fd, struct douban_radio *douban)
{
		rt_size_t length;
		struct http_session* session;
		char *buffer,*ptr;

		int index = 0;
		char index_buff[1] ={0};

		char protocol_buff[5]={0};
		char length_buff[10]={0};
		
		tcflush(uart_fd, TCIOFLUSH);

		char command_buff[1] = {JPG_INDEX};
		write(uart_fd, command_buff, 1);
		printf("JPG_INDEX is send \n");
		
	if(uart_read(uart_fd, index_buff, 1, 1) > 0)
	{
		index = atoi(index_buff);
		printf("jpg index is read %d!\n", index);

		session=http_session_open(douban->items[index].picture);
		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);

			tcflush(uart_fd, TCIOFLUSH);
			printf("begin to send jpg's length!\n");
			sprintf(length_buff ,"%d",session->size);
			printf("length_buff is %s\n", length_buff);
			write(uart_fd, length_buff, 10);
			printf("length is send\n\n");
			printf("wait for it's ready!\n");
	
			if(uart_read(uart_fd, protocol_buff, 1 ,2) > 0)
			{
				if(protocol_buff[0] == JPG_LENGTH_END)
				{	
					printf("ready to send jpg data!\n");
					write(uart_fd, buffer, (int)session->size);
					printf("jpg data is send!\n");
					printf("wait for it's ready!\n");
					if( uart_read(uart_fd, protocol_buff, 1, 8) > 0)
					{
						if(protocol_buff[0] == JPG_END)
						{
							printf("jpg_end\n");
							return 1;
						}
						else
						{
						 	printf("error 4!\n");
						}
					}
					else 
					{
						printf("error 3!\n");
					}		
				}
				else 
				{
					printf("error 2!\n");
				}
			}
			else 
			{
				printf("error 1!\n");
			}

		free(buffer);
	}
}