get some new maintainers
[mplayer/glamo.git] / libmenu / menu_dvbin.c
blob1e48508db30dc6565cb28e05f3bc10b229df7f67
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <dirent.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <ctype.h>
10 #include <unistd.h>
11 #include <limits.h>
14 #include "../config.h"
16 #include "../m_struct.h"
17 #include "../m_option.h"
19 #include "img_format.h"
20 #include "mp_image.h"
22 #include "menu.h"
23 #include "menu_list.h"
24 #include "../input/input.h"
25 #include "../osdep/keycodes.h"
27 #include "../libmpdemux/dvbin.h"
31 struct list_entry_s {
32 struct list_entry p;
33 int num; //the position of the chosen channel in the list
36 struct menu_priv_s {
37 menu_list_priv_t p;
38 char* title;
39 char* file;
40 int card;
44 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s, m)
45 #define mpriv (menu->priv)
47 static m_option_t cfg_fields[] = {
48 MENU_LIST_PRIV_FIELDS,
49 { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL },
50 { "file", ST_OFF(file), CONF_TYPE_STRING, 0, 0, 0, NULL },
51 { "card", ST_OFF(card), CONF_TYPE_INT, 0, 0, 0, NULL },
52 { NULL, NULL, NULL, 0,0,0,NULL }
56 static struct menu_priv_s cfg_dflt = {
57 MENU_LIST_PRIV_DFLT,
58 "Select a channel: %p",
59 "channels.conf",
61 NULL,
67 static void free_entry(list_entry_t* entry)
69 free(entry->p.txt);
70 free(entry);
74 static int fill_menu(menu_t* menu)
76 int n;
77 list_entry_t* elem;
78 char *name;
79 extern dvb_channels_list *dvb_list_ptr;
80 dvb_channel_t *channel;
82 menu_list_init(menu);
84 mpriv->p.title = mpriv->title;
86 if(dvb_list_ptr == NULL)
88 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: LIST NULL PTR, quit\n");
89 n = 1;
90 if((elem = malloc(sizeof(list_entry_t))) != NULL)
92 name = malloc(80);
93 sprintf(name, "Empty channel list from file %s; \nrun mplayer dvb:// to load the list", mpriv->file);
94 elem->p.next = NULL;
95 elem->p.txt = name;
97 menu_list_add_entry(menu, elem);
100 else
102 n = dvb_list_ptr->NUM_CHANNELS;
103 for(n = 0; n < dvb_list_ptr->NUM_CHANNELS; n++)
105 channel = &(dvb_list_ptr->channels[n]);
106 if((elem = malloc(sizeof(list_entry_t))) != NULL)
108 name = malloc(80);
109 strncpy(name, channel->name, 79);
110 name[79] = 0;
111 elem->p.next = NULL;
112 elem->p.txt = name;
113 elem->num = n;
115 if(n == 0)
116 elem->p.prev = NULL;
118 menu_list_add_entry(menu, elem);
120 else
122 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_menu: fill_menu: couldn't malloc %d bytes for menu item: %s, exit\n",
123 sizeof(list_entry_t), strerror(errno));
125 if(n)
126 return 1;
128 return 0;
133 return 1;
137 static void read_cmd(menu_t* menu, int cmd)
139 list_entry_t *p;
140 mp_cmd_t* c;
141 char *cmd_name;
142 switch(cmd)
144 case MENU_CMD_OK:
146 p = mpriv->p.current;
147 mp_msg(MSGT_DEMUX, MSGL_V, "CHOSEN DVB CHANNEL %d\n\n", p->num);
149 cmd_name = malloc(30);
150 sprintf(cmd_name, "dvb_set_channel %d", p->num);
151 c = mp_input_parse_cmd(cmd_name);
152 if(c)
153 mp_input_queue_cmd(c);
155 break;
157 default:
158 menu_list_read_cmd(menu, cmd);
163 static void close_menu(menu_t* menu)
165 menu_list_uninit(menu, free_entry);
166 //free(mpriv->dir);
170 static int open_dvb_sel(menu_t* menu, char* args)
172 menu->draw = menu_list_draw;
173 menu->read_cmd = read_cmd;
174 //menu->read_key = read_key;
175 menu->close = close_menu;
177 return fill_menu(menu);
180 const menu_info_t menu_info_dvbsel =
182 "DVB channels menu", //descr
183 "dvbsel", //name
184 "Nico", //author
185 "dvb_sel",
186 { //m_struct_t priv_st=
187 "dvb_cfg", //name
188 sizeof(dvb_channels_list), //size
189 &cfg_dflt, //defaults
190 cfg_fields //settable fields
192 open_dvb_sel //open function