提交 a4ce0520 编写于 作者: wuyangyong's avatar wuyangyong

update radio_list_update by inkfish

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@510 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 bfc473eb
此差异已折叠。
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>
#include <stdio.h>
#include <stdlib.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>
#include <stm32f10x.h> #include <stm32f10x.h>
#include <rtthread.h> #include <rtthread.h>
#include <dfs_posix.h> #include <dfs_posix.h>
...@@ -20,8 +28,16 @@ extern int http_resolve_address(struct sockaddr_in *server, const char * url, ch ...@@ -20,8 +28,16 @@ extern int http_resolve_address(struct sockaddr_in *server, const char * url, ch
const char _radio_list_update_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\nConnection: close\r\n\r\n"; const char _radio_list_update_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\nConnection: close\r\n\r\n";
rt_mq_t update_radio_mq = RT_NULL; rt_mq_t update_radio_mq = RT_NULL;
static struct rtgui_view* update_radio_list_view = RT_NULL;
typedef enum
{
UPDATE_RAIDO_LIST_PROC,
UPDATE_RADIO_LIST_CONNECT_FAILED,
UPDATE_RADIO_LIST_SUCCEED,
} UPDATE_RADIO_LIST_STATE;
static UPDATE_RADIO_LIST_STATE update_radio_list_state;
int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_addr, const char* url) int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_addr, const char* url)
{ {
...@@ -39,6 +55,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -39,6 +55,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server));
if ( peer_handle < 0 ) if ( peer_handle < 0 )
{ {
closesocket(socket_handle);
rt_kprintf( "RLUS: CONNECT FAILED %i\n", peer_handle ); rt_kprintf( "RLUS: CONNECT FAILED %i\n", peer_handle );
return -1; return -1;
} }
...@@ -66,8 +83,11 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -66,8 +83,11 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
rc = http_read_line(peer_handle, mimeBuffer, 100); rc = http_read_line(peer_handle, mimeBuffer, 100);
rt_kprintf(">>%s", mimeBuffer); rt_kprintf(">>%s", mimeBuffer);
if ( rc < 0 ) return rc; if ( rc < 0 )
{
closesocket(peer_handle);
return rc;
}
// End of headers is a blank line. exit. // End of headers is a blank line. exit.
if (rc == 0) break; if (rc == 0) break;
if ((rc == 2) && (mimeBuffer[0] == '\r')) break; if ((rc == 2) && (mimeBuffer[0] == '\r')) break;
...@@ -78,6 +98,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -78,6 +98,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
if(rc) if(rc)
{ {
rt_kprintf("HTTP: status code = %d!\n", rc); rt_kprintf("HTTP: status code = %d!\n", rc);
closesocket(peer_handle);
return -rc; return -rc;
} }
} }
...@@ -88,6 +109,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -88,6 +109,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
if (strstr(mimeBuffer, "text/plain") == RT_NULL) if (strstr(mimeBuffer, "text/plain") == RT_NULL)
{ {
rt_kprintf("radio list update content is not text/plain.\n"); rt_kprintf("radio list update content is not text/plain.\n");
closesocket(peer_handle);
return -1; return -1;
} }
} }
...@@ -98,6 +120,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -98,6 +120,7 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
if (strstr(mimeBuffer, "text/plain") == RT_NULL) if (strstr(mimeBuffer, "text/plain") == RT_NULL)
{ {
rt_kprintf("radio list update content is not text/plain.\n"); rt_kprintf("radio list update content is not text/plain.\n");
closesocket(peer_handle);
return -1; return -1;
} }
} }
...@@ -105,9 +128,10 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a ...@@ -105,9 +128,10 @@ int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_a
return peer_handle; return peer_handle;
} }
int radio_list_update_servicer_session_open(char* url) int radio_list_update_servicer_session_open(char* url)
{ {
int peer_handle = 0; int peer_handle = -1;
struct sockaddr_in server; struct sockaddr_in server;
char *request, host_addr[32]; char *request, host_addr[32];
...@@ -124,7 +148,7 @@ int radio_list_update_servicer_session_open(char* url) ...@@ -124,7 +148,7 @@ int radio_list_update_servicer_session_open(char* url)
return peer_handle; return peer_handle;
} }
void update_radio_list(char* url) int update_radio_list(char* url)
{ {
char *buf = NULL; char *buf = NULL;
int peer_handle = 0; int peer_handle = 0;
...@@ -135,13 +159,13 @@ void update_radio_list(char* url) ...@@ -135,13 +159,13 @@ void update_radio_list(char* url)
if(peer_handle < 0) if(peer_handle < 0)
{ {
return; return -1;
} }
fd = open(RADIO_FN, O_WRONLY | O_CREAT | O_TRUNC, 0); fd = open(RADIO_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
if(fd < 0) if(fd < 0)
{ {
return; return -1;
} }
buf = rt_malloc (512); buf = rt_malloc (512);
while ( 1 ) while ( 1 )
...@@ -160,11 +184,13 @@ void update_radio_list(char* url) ...@@ -160,11 +184,13 @@ void update_radio_list(char* url)
} }
rt_free(buf); rt_free(buf);
closesocket(peer_handle);
if(close(fd) == 0) if(close(fd) == 0)
{ {
rt_kprintf("Update radio list succeed \r\n"); rt_kprintf("Update radio list succeed \r\n");
} }
return 0;
} }
void update_radio_list_req(void) void update_radio_list_req(void)
...@@ -174,6 +200,7 @@ void update_radio_list_req(void) ...@@ -174,6 +200,7 @@ void update_radio_list_req(void)
extern rt_mq_t player_thread_mq; extern rt_mq_t player_thread_mq;
char* ch = RT_NULL; char* ch = RT_NULL;
update_radio_list_state = UPDATE_RAIDO_LIST_PROC;
request.type = PLAYER_REQUEST_UPDATE_RADIO_LIST; request.type = PLAYER_REQUEST_UPDATE_RADIO_LIST;
ch = strncpy(request.fn, RADIO_LIST_UPDATE_URL, strlen(RADIO_LIST_UPDATE_URL)); ch = strncpy(request.fn, RADIO_LIST_UPDATE_URL, strlen(RADIO_LIST_UPDATE_URL));
...@@ -187,6 +214,8 @@ void update_radio_thread(void* parameter) ...@@ -187,6 +214,8 @@ void update_radio_thread(void* parameter)
rt_err_t result; rt_err_t result;
struct player_request request; struct player_request request;
rt_thread_t update_radio_list_thread; rt_thread_t update_radio_list_thread;
while(1) while(1)
{ {
/* get request from message queue */ /* get request from message queue */
...@@ -196,11 +225,25 @@ void update_radio_thread(void* parameter) ...@@ -196,11 +225,25 @@ void update_radio_thread(void* parameter)
{ {
switch (request.type) switch (request.type)
{ {
case PLAYER_REQUEST_UPDATE_RADIO_LIST: case PLAYER_REQUEST_UPDATE_RADIO_LIST:
if ((strstr(request.fn, "http://") == request.fn || if ((strstr(request.fn, "http://") == request.fn ||
(strstr(request.fn, "HTTP://") == request.fn ))) (strstr(request.fn, "HTTP://") == request.fn )))
{ {
update_radio_list(request.fn); struct rtgui_event_command ecmd;
if(update_radio_list(request.fn)==0)
{
update_radio_list_state = UPDATE_RADIO_LIST_SUCCEED;
}
else
{
update_radio_list_state = UPDATE_RADIO_LIST_CONNECT_FAILED;
}
RTGUI_EVENT_COMMAND_INIT(&ecmd);
ecmd.type = RTGUI_EVENT_PAINT;
ecmd.command_id = PLAYER_REQUEST_UPDATE_RADIO_LIST;
rtgui_thread_send(rt_thread_find("ply_ui"), &ecmd.parent, sizeof(ecmd));
} }
break; break;
} }
...@@ -212,3 +255,114 @@ void update_radio_thread(void* parameter) ...@@ -212,3 +255,114 @@ void update_radio_thread(void* parameter)
} }
} }
void drawing_update_state_info(struct rtgui_widget* widget)
{
char* line;
struct rtgui_dc* dc;
struct rtgui_rect rect;
line = rtgui_malloc(256);
if (line == RT_NULL) return ;
dc = rtgui_dc_begin_drawing(widget);
if (dc == RT_NULL)
{
rt_free(line);
return;
}
rtgui_widget_get_rect(widget, &rect);
/* fill background */
rtgui_dc_fill_rect(dc, &rect);
rect.y2 = rect.y1 + 18;
switch(update_radio_list_state)
{
case UPDATE_RAIDO_LIST_PROC:
sprintf(line, "正在更新电台列表......");
break ;
case UPDATE_RADIO_LIST_CONNECT_FAILED:
sprintf(line, "更新电台列表失败,请返回");
break;
case UPDATE_RADIO_LIST_SUCCEED:
sprintf(line, "更新电台列表成功,请返回");
break;
}
rtgui_dc_draw_text(dc, line, &rect);
rtgui_dc_end_drawing(dc);
rtgui_free(line);
}
static rt_bool_t update_radio_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
switch (event->type)
{
case RTGUI_EVENT_COMMAND:
{
struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;
switch(ecmd->type)
{
case RTGUI_EVENT_PAINT:
drawing_update_state_info(widget);
return RT_FALSE;
}
return RT_FALSE;
}
case RTGUI_EVENT_PAINT:
{
drawing_update_state_info(widget);
return RT_FALSE;
}
case RTGUI_EVENT_KBD:
{
struct rtgui_event_kbd* ekbd;
ekbd = (struct rtgui_event_kbd*)event;
if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN)
{
rtgui_workbench_t* workbench;
workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(update_radio_list_view)->parent);
rtgui_workbench_remove_view(workbench, update_radio_list_view);
rtgui_view_destroy(update_radio_list_view);
update_radio_list_view = RT_NULL;
}
}
return RT_FALSE;
}
/* use parent event handler */
return rtgui_view_event_handler(widget, event);
}
rtgui_view_t *update_radio_list_view_create(rtgui_workbench_t* workbench)
{
if (update_radio_list_view != RT_NULL)
{
rtgui_view_show(update_radio_list_view, RT_FALSE);
}
else
{
/* create a view */
update_radio_list_view = rtgui_view_create("update radio list Info");
/* set view event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(update_radio_list_view), update_radio_list_view_event_handler);
/* this view can be focused */
RTGUI_WIDGET(update_radio_list_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* add view to workbench */
rtgui_workbench_add_view(workbench, update_radio_list_view);
}
return update_radio_list_view;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册